我创建了 2 个指令:Parent 和 Child。试图让他们互相交谈。似乎如果他们都有一个范围,他们就不会收到事件。根据 $emit
声明的文档,这似乎不正确:通过范围层次结构向上分发事件名称,通知已注册的 ng.$rootScope.Scope#methods_$on 监听器。
那么肯定应该通过作用域冒泡吗?
最佳答案
问题出在你的 parent / child 假设上:
- Parent 只是Child 的父元素,而不是父作用域。
- 实际上它们是兄弟作用域,在本例中都是$rootScope ($id: 002) 的子作用域。
为什么??
- 由于this commit ,
Isolate 作用域现在仅对请求它的 isolate 指令及其模板可用
。 - 这意味着父指令内容(包括子指令)仍然链接到外部范围。
- 因此 child 指令创建了独立作用域,它是外部作用域的子作用域。
- $emit 和 $broadcast 都不能与同级范围一起使用。
解决方案:
这是一个笨蛋:http://plnkr.co/edit/EfKJthkQLitWnF2srykM?p=preview
您可以将子指令创建为父指令的模板,因为模板指令确实获取指令的范围,如上所述。
.directive('parent', function ($timeout) {
return {
template:'<child name="Jimmy"></child>',
你真的需要事件总线吗?
另一种解决方案是在父指令上创建一个 Controller 并在子指令中要求它。
.directive('parent', function ($timeout) {
return {
controller: function(){
this.hungry = function(message){
// something
}
}
子指令:
.directive('child', function ($timeout) {
return {
require: "^parent",
link: function (scope, element, attrs, parentCtrl) {
parentCtrl.hungry("I'm hungry!")
关于javascript - AngularJS - $emit 仅在其当前范围内有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402756/