javascript - AngularJS - $emit 仅在其当前范围内有效?

标签 javascript angularjs

我创建了 2 个指令:Parent 和 Child。试图让他们互相交谈。似乎如果他们都有一个范围,他们就不会收到事件。根据 $emit 声明的文档,这似乎不正确:通过范围层次结构向上分发事件名称,通知已注册的 ng.$ro​​otScope.Scope#methods_$on 监听器。

那么肯定应该通过作用域冒泡吗?

http://plnkr.co/edit/WNqN4XZKaLAvBEtSyERA?p=preview

最佳答案

问题出在你的 parent / child 假设上:

  • Parent 只是Child 的父元素,而不是父作用域。
  • 实际上它们是兄弟作用域,在本例中都是$rootScope ($id: 002) 的子作用域。

为什么??

  • 由于this commit , Isolate 作用域现在仅对请求它的 isolate 指令及其模板可用
  • 这意味着父指令内容(包括子指令)仍然链接到外部范围。
  • 因此 child 指令创建了独立作用域,它是外部作用域的子作用域。
  • $emit$broadcast 都不能与同级范围一起使用。

enter image description here


解决方案:

这是一个笨蛋: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/

相关文章:

javascript - js中如何删除数组中的数组元素?

javascript - 使用 $http 的 Angular Slider 和 ui.router 数据不变

javascript - 第二个 promise 决定不解雇

javascript - 将当前 HTMLElement 传递给 ng-click

javascript - 数据包含连续问号时无法理解的 jQuery $.ajax() 行为

javascript - 向父元素和子元素添加 "active"类

javascript - 在 JavaScript 中返回一个数组

javascript - 如何使用react获取html格式的表格?

AngularJS $q.延迟队列

javascript - 为什么 Angular 模型名称中的点会导致 Controller 无法找到它?