不能在将指令作用域设置为false的指令负面影响中从孤立作用域广播

Can't broadcast from isolated scope in directive—negative implications of setting directive scope to false?

本文关键字:指令 作用域 影响 广播 设置 不能 false      更新时间:2023-09-26

我有一种情况,我想从指令的链接函数内$broadcast -其中该指令具有孤立的作用域。不幸的是,由于指令scope不是典型地继承自父指令$scope,因此不可能在孤立的作用域中广播,-参考。

我知道在我的指令上使用scope: false将导致指令使用它的父范围,潜在地拥挤父范围,并导致可能的命名冲突等,使指令在可重用性方面不太可靠。

所以,也许我可以小心地拥挤父作用域。是否有其他原因,为什么我可能不想使用scope: false的指令,打算被重用?-这仅仅是一个喜好和"整洁"的事情,还是有其他的负面影响?

据我所知,除了让指令改变一个服务(这在我的情况下是不可能的,因为父作用域层次结构)之外,没有其他选择来获得从指令的链接函数内部广播实现的功能,所以据我所知,使用$broadcast是唯一的方法。如有任何指导,欢迎。

谢谢!

编辑:要清楚,我的意图是从隔离作用域内部广播,向下到父作用域的子,即

JS

.controller('parent', function ($scope) {
  $scope.parent = 'parentProperty';
})
.directive('isolate', function() {
  return {
    scope: {},
    template: '<div ng-click="click()">Click</div>',
    link: function (scope) {
      scope.click = function () {
        console.log('clicked,but no broadcast');
      scope.$broadcast('event', 'string');
      }
    }
    };
})
.directive('child', function () {
  return {
  link: function(scope) {
    scope.$on('event', function (e, event) {
      console.log(event);
    });
  }
};
});
HTML

  <body ng-controller="parent">
    <div isolate>Click me to broadcast
      </div>
      <div child>
        </div>
  </body>

PLNKR: http://plnkr.co/edit/wKDOP4UpdgDFrHvzY0UN?p=preview

我想你误解了你链接的文章。可以广播事件以隔离作用域。甚至在你的文章中提到:

可以看到,隔离作用域能够监听通过作用域层次结构向下广播的事件;但是,它无法在其父作用域中看到相关的作用域值"pingCount"。

技巧是要记住,在AngularJS中,$broadcast发送事件父/子作用域层次结构(包括隔离作用域)。您可以使用$emit将事件发送到层次结构。

听起来你想在指令的链接函数中使用$emit,这样事件就会转到父范围。来自文档的解释

编辑

好,这里有一个使用两个事件的简单方法。该指令首先使用$emit()向父作用域发送一个事件。父作用域使用$on()来等待此事件。当它发生时,它使用$broadcast()向所有子作用域发送另一个事件。

Plunkr

这是原始的,很可能会崩溃。相反,你可以考虑使用指令的require属性,并使用带有子指令用于通信的API的控制器。