当我尝试通过$ scope对象将指令中的事件发送到嵌套指令时,会出现问题。例如。 $scope.broadcast('event')
子指令没有收到该事件,但是当我使用$ rootScope对象时它会工作,例如$rootScope.broadcast('event')
。
TL; DR :为什么这不起作用:http://plnkr.co/edit/27qYiHOilpVABSwMI0Fb?p=preview何时有效:http://plnkr.co/edit/o91yFKnQzHp7edUTTkJE?p=preview
编辑:在angular.js版本1.3.0及更高版本中,这不再是问题!!!
答案 0 :(得分:2)
您的指令使用ng-transclude
。来自文档:
在典型的设置中,窗口小部件创建了一个隔离范围,但是,该隔离不是子项,而是隔离范围的兄弟。
这是您的范围层次结构的样子:
one
two
元素所在的转换范围two
two
因为您可以看到two
的范围不是one
的子范围。
答案 1 :(得分:2)
Transclusion创建了一个“隔离”范围,但是这种划分并非如此 孩子,但是'孤立'范围的兄弟。
(源代码)
没有父母< - >孩子的关系。因此$ broadcast,$ emit将无效,因为$ broadcast需要孩子,而$ emit需要你认为是兄弟姐妹的父母。
这里有很多很好的解释,可能会鼓励你重新思考控制器的组织方式,以及你如何使用ng-transclude。如果你想要另一个解决方案,我写了一个小指令,解决了两个指令之间的交互,以创建父< - >子层次结构。使用风险自负,我希望这会有所帮助! :)
答案 2 :(得分:0)
这是因为你给了指令隔离范围。如果希望它具有包含父元素的嵌套范围,请从指令中删除scope参数。或者,您可以在范围上定义要传递到指令范围的父作用域的属性和值。
答案 3 :(得分:0)
如果FirstCtrl
的范围是SecondCtrl
范围的父级,则应在FirstCtrl
中使用 $ broadcast 方法:
'use strict';
angular.module('myAppControllers', [])
.controller('FirstCtrl', function ($scope) {
$scope.$broadcast('UPDATE_CHILD');
})
.controller('SecondCtrl', function ($scope) {
$scope.$on('UPDATE_CHILD', function() {
// do something useful here;
});
});
如果范围之间没有父/子关系,则应将$ rootScope 注入FirstCtrl并将事件广播到其他控制器(包括SecondCtrl)及其相应的(本例中为子)$ scope的:
'use strict';
angular.module('myAppControllers', [])
.controller('FirstCtrl', function ($rootScope) {
$rootScope.$broadcast('UPDATE_ALL');
});