【发布时间】:2015-04-30 10:52:28
【问题描述】:
我正在使用 AngularJS 指令创建可重用的 UI 组件。我想要一个控制器,其中包含我的业务逻辑和嵌套组件(指令)。我希望指令能够操纵控制器范围内的单个属性。这些指令需要有一个隔离作用域,因为我可能会多次使用同一个指令,并且每个实例都需要绑定到特定的控制器作用域属性。
到目前为止,我可以将更改应用回控制器范围的唯一方法是从指令中调用 scope.$apply()。但是当我因为 rootScope:inprog(范围操作正在进行)错误而在 ng-click 回调中时,这会中断。
所以我的问题:当子指令更新了控制器范围内的值时,让我的控制器知道的最佳方法是什么?
我考虑过在控制器上设置一个指令可以调用以进行更新的函数,但这对我来说似乎很重。
这是我在 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>'
};
}]);
【问题讨论】:
-
你可以在 $rootScope 上发出事件。
-
@camden_kid 我希望有更好的封装。至少我会使用我考虑过的控制器方法。不过,我不认为我想在根范围上添加更多聊天内容。
-
您不需要调用 $apply(),因为 buttonClick 函数由 ng-click 指令调用,因此不会在 angular 事件处理之外执行。如果你想修改一个属性,那么你所拥有的就可以了(除非你不应该使用 $apply())。如果要调用回调函数,则使用
'&'而不是'='传递可调用函数。 -
你可以注入一个服务。我注意到的一件事是指令元素标记中有一个按钮。它不会那样工作。您的指令中需要一个模板(或 templateURL)。
-
@camden_kid 你是对的模板。为简洁起见,我以这种方式发布,但我会进行编辑。
标签: angularjs angularjs-directive angularjs-scope