【问题标题】:AngularJS: Broadcast event from parent only to it childrenAngularJS:仅从父级向其子级广播事件
【发布时间】:2016-03-01 13:13:59
【问题描述】:

我想将事件从父指令广播到子指令。但是如果我在父指令链接函数中使用 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>

【问题讨论】:

    标签: javascript angularjs angularjs-directive angular-broadcast


    【解决方案1】:

    可能的原因 - 父指令共享相同的范围,这就是您的事件传播到所有子指令的原因。

    解决方案 - 每个指令都应该定义自己的范围,该范围在原型上是从父级继承的。 ($root &lt;-- parent &lt;-- 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

    【讨论】:

    • 哇!我正在尝试使用范围:{} 而不是范围:真。谢谢,成功了!
    • 欢迎您! {} 中断范围原型链,隔离指令的唯一父级将是 $root
    【解决方案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;
    });
    

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2017-10-18
      • 2021-04-16
      • 2016-09-23
      • 2018-10-06
      • 2015-07-13
      相关资源
      最近更新 更多