我正在使用AngularJS指令创建可重用的UI组件。我希望有一个包含业务逻辑和嵌套组件(指令)的控制器。我想让指令能够操纵控制器作用域上的单个属性。因为可能会使用同一个指令多次,所以指令需要具有孤立作用域,并且每个实例都需要绑定到特定的控制器作用域属性。
目前,我唯一的方法是从指令中调用`scope.$apply()`将更改应用回控制器的作用域。但是当我在`ng-click`回调中时,会出现`rootScope:inprog`(操作正在进行中)错误。
我的问题是:最好的方法是什么,可以使控制器知道子指令已经更新了控制器作用域上的值?
我考虑过在控制器上拥有一个函数,指令可以调用该函数进行更新,但我认为那样太麻烦了。
以下是我在`ng-click`回调上断开的代码。请记住,我不仅要解决`ng-click`问题,还要找到应用可重用指令来修改父级作用域/模型的最佳方案。
html
目前,我唯一的方法是从指令中调用`scope.$apply()`将更改应用回控制器的作用域。但是当我在`ng-click`回调中时,会出现`rootScope:inprog`(操作正在进行中)错误。
我的问题是:最好的方法是什么,可以使控制器知道子指令已经更新了控制器作用域上的值?
我考虑过在控制器上拥有一个函数,指令可以调用该函数进行更新,但我认为那样太麻烦了。
以下是我在`ng-click`回调上断开的代码。请记住,我不仅要解决`ng-click`问题,还要找到应用可重用指令来修改父级作用域/模型的最佳方案。
html
<div ng-controller="myCtrl">
<my-directive value="val1"></my-directive>
</div>
控制器
...
.controller('myCtrl', ['$scope', function ($scope) {
$scope.val1 = 'something';
}});
指令
...
.directive('myDirective', [function () {
return {
link: function(scope) {
scope.buttonClick = function () {
var val = 'new value';
scope.value = val;
scope.$apply();
};
},
scope: {
value: '='
},
template: '<button ng-click="buttonClick()"></button>'
};
}]);
'&'
传递可调用函数,而不是'='
。 - JB Nizet