AngularJS:如何将事件从父组件广播到其子组件?

3
我想从父指令向子指令广播事件。但是如果我在父指令的链接函数中使用scope.broadcast,那么每个“父”指令中的所有子元素都会接收到它。
现在的工作方式: 如果父级(1)广播事件,则子级(1.1)和(2.1)都会接收事件。
我希望它的工作方式是: 我只想从父级(1)向子级(1.1)广播事件,而不是向子级(2.1)广播。
我的指令检查元素是否在屏幕上。我只想要一个这样的指令,并且只有这个指令应该向其他指令发送事件。
<div>
    <div parent> <!-- 1 -->
        <div child></div> <!-- 1.1 -->
    </div>

    <div parent> <!-- 2-->
        <div child></div> <!-- 2.1 -->
    </div>
</div>
2个回答

3

可能的原因 - 父指令与子指令共享相同的作用域,这就是为什么您的事件会传播到所有子指令的原因。

解决方法 - 每个指令应该定义自己的作用域,它们的作用域原型继承自父级。 ($root <-- parent <-- child)

<!DOCTYPE html>
<html ng-app="app">

  <head>
    <script data-require="angular.js@1.4.7" data-semver="1.4.7" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script>
      angular
        .module('app', [])
        .directive('parent', function() {
          return {
            scope: true,
            link: function(scope, element) {
              element.on('click', function() {
                scope.$broadcast('parent-event');
              });
            }
          };
        })
        .directive('child', function() {
          return {
            scope: true,
            link: function(scope) {
              scope.$on('parent-event', function() {
                console.log('child(' + scope.$id + ') caught parent event');
              });
            }
          };
        });
    </script>
  </head>

  <body>
    <div>
      <div parent> Parent {{ $id }}
          <div child>Child {{ $id }}</div>
      </div>

      <hr />

      <div parent> Parent {{ $id }}
          <div child>Child {{ $id }}</div>
      </div>
  </div>
  </body>
</html>

Plunker


哇!我之前一直用的是 scope: {},而不是 scope: true。谢谢,现在可以正常工作了! - psalkowski
欢迎!{} 打破了作用域原型链,孤立指令的唯一父级将是 $root - sbedulin

2
当您广播数据时,您会将其发送到所有子作用域。可能的解决方案是:
$scope.$broadcast('customEvent', {
    target: ['dir1', 'dir2'],
    someProp: 'Sending you an Object!' // send whatever you want
});

然后在第一个指令中

$scope.$on('customEvent', function (event, data) {
   if(data.target.indexOf('dir1') === -1 ) return;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接