我有一种情况,我希望$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>
答案 0 :(得分:4)
我认为你误解了你链接的文章。您可以广播事件以隔离范围。甚至有人说你在帖子中提到:
如您所见,隔离范围能够侦听通过范围层次结构向下广播的事件;但是,它无法在其父范围内看到相关的范围值“pingCount”。
诀窍是要记住,在AngularJS中$broadcast
将事件向下发送父/子范围层次结构(包括隔离范围)。您可以使用$emit
发送事件< em> up 层次结构。
听起来你想在你的指令的链接函数中使用$emit
,这样事件就会转到父作用域。来自文档的Explanation。
修改强>
好的,这是一个使用两个事件的简单方法。该指令首先使用$emit()
将事件发送到父作用域。父作用域使用$on()
来等待此事件。当它发生时,它使用$broadcast()
将另一个事件发送到所有子范围。
这是原始的,可能会崩溃。相反,您可以查看使用指令的require
属性,并使用带有子指令用于通信的API的控制器。