在将指令范围设置为false的指令负面含义中,不能从隔离范围广播吗?

时间:2015-05-30 05:32:37

标签: javascript angularjs angularjs-directive scope

我有一种情况,我希望$broadcast来自指令的链接函数 - 该指令具有独立的范围。不幸的是,由于指令scope不是从父$scope原型继承的,因此不可能在隔离范围内进行广播, - reference.

我知道在我的指令中使用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

1 个答案:

答案 0 :(得分:4)

我认为你误解了你链接的文章。您可以广播事件以隔离范围。甚至有人说你在帖子中提到:

  

如您所见,隔离范围能够侦听通过范围层次结构向下广播的事件;但是,它无法在其父范围内看到相关的范围值“pingCount”。

诀窍是要记住,在AngularJS中$broadcast将事件向下发送父/子范围层次结构(包括隔离范围)。您可以使用$emit发送事件< em> up 层次结构。

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

修改

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

Plunkr

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