通常我们给child-directive一个回调函数,如果发生了什么事情就可以调用它。就我而言,反之亦然;我想告诉指示一些事情。我仍然使用角度1.4(但很快我会移动到1.5并最终移动到2)。考虑到这一点,我想避免使用$watch
和$broadcast
之类的内容。
所以,我认为有两种解决方案:1)使用服务和2)将一个回调函数从子节点绑定到父节点
1)虽然这可能是首选解决方案,但我发现有两个问题
a)完成这项简单任务的全部服务
b)您需要$watch
来检测更改
2)嗯,这个解决方案听起来非常简单,但似乎比我预期的要复杂得多,或者甚至不可能:(
这是我的测试代码:
<button ng-click="mycontroller.callback()">Click me</button>
<bar-foo activate-me="mycontroller.callback"></bar-foo>
因此,mycontroller
没有函数callback
,但指令bar-foo
没有
angular.module('HelloApp')
.directive('barFoo', function () {
return {
restrict: 'E',
scope:{
activateMe: '='
},
controller: function ($scope) {
$scope.activateMe = function () {
this.activated = true
}
},
template: '<p ng-if="activated">Activated</p>'
}
});
我尝试的是什么?或者我应该接受services
是解决这个问题的唯一方法还是更多?
答案 0 :(得分:1)
我觉得你在这里想的太难了。虽然可以为外部控制器提供一个直接调用和通知指令的功能(你不应该这样做),但更直接和自然的方法是使用输入绑定。在您的情况下,它将如下所示:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="HelloApp" data-ng-controller="MyCtrl as mycontroller">
<button ng-click="mycontroller.callBarFoo()">Click me</button>
<bar-foo activate-me="mycontroller.callback"></bar-foo>
</div>
&#13;
{{1}}&#13;
通常,控制器应该在适当的时候让指令知道数据。这是推荐的数据流方向:来自控制器 - &gt;成指令。指令永远不应该要求数据本身。它的控制器决定何时以及将什么传递给指令。当指令可能需要一些数据时 - 可以使用双向绑定。
答案 1 :(得分:0)
我知道的另一种方法是将一些id附加到指令根元素。 然后从你的控制器你可以这样做。
angular.element(document.getElementById('the-id')).scope().directiveFunction(args);