我在一个控制器下有两个指令:
<div ng-controller="ctrl">
<div data-dy-items-list items="items"></div> // FIRST DIRECTIVE
<div data-dy-subitems-list subitems="subitems"></div> //SECON DIRECTIVE
</div>
在Second指令模板中,我有一个按钮,在控制器部分的directive.js文件中我这样做了:
$scope.clickButton= function () {
......
$scope.$emit("UPDATE_PARENT","updated");
}
在第一个指令中,我想在控制器部分执行此操作:
$scope.update = false;
$scope.$on("UPDATE_PARENT", function (event,message){
$scope.update = true;
console.log('update: ' + $scope.update);
});
但它不起作用!!!
答案 0 :(得分:7)
$emit
通过范围层次结构调度向上事件。你的指令是兄弟姐妹,因此$emit
将不起作用。
解决方案可能是$broadcast
来自父作用域的事件。如果这是您的选项,请从ctrl
执行此操作,或者将$rootScope
注入指令并从那里执行$rootScope.$broadcast
:
$rootScope.$brodcast("UPDATE_PARENT","updated");
请注意来自$broadcasting
的{{1}}个事件似乎是AngularJS的反模式。它在很大程度上取决于用例。您的问题还有其他解决方案:
$rootScope
。然后,您可以对服务数据执行service
并做出相应的反应。$watch
将事件发送至$emit
,然后将ctrl
ctrl
发送至另一指令。选择最适合您需求的产品。
答案 1 :(得分:2)
我遇到了同样的问题。
现在传递了两个指令之间的事件,而不是范围。$ emit,而不是范围。$ broadcast。
环顾四周后,我做了这个伎俩, 使用范围。$ parent。$ with your parent scope:
指令1:
scope.$parent.$broadcast('NO_LIVE_CONNECTION', {});
指令2:
scope.$on('NO_LIVE_CONNECTION', function (event, params) {
console.log("No live DB connections ...");
scope.state.showErrorMessage = true;
});