我有以下标记:
<div class="grandparent">
<div class="parent" ng-repeat="parent in parents">
<div class="child" ng-repeat="child in parent.children">
<div class="grandchild" ng-repeat="grandchild in child.grandchild">
现在,.grandchild
希望将$broadcast
内容转移到另一个.grandchild
。这可以通过$rootScope.$broadcast('SOMETHING');
完成。
但是我不想使用$rootScope
,因此$ digest不会贯穿所有内容。相反,我想做scope.$parent.$parent.$parent.$broadcast('SOMETHING')
。
虽然这很难看,但最终会减少元素,因为它只会通过范围grandparent
还有其他建议吗? (为了这个例子的目的,假设我必须使用broadcast
。所以请不要评论说我不应该使用这个)
答案 0 :(得分:0)
我通常会避免将事件侦听器附加到各个范围。
执行所需操作的有效方法是使用$rootScope.$on
和$rootScope.$emit
(不是$broadcast
)。 $emit
和$broadcast
之间的区别在于$emit
不会向下传播,因此它只影响那些直接订阅的人。
答案 1 :(得分:0)
点击AngularJS事件不会在任何地方触发对$digest
的调用。它只会呼叫所有注册用户。如果您在$broadcast
或$scope
中$rootScope
,则无关紧要。调用摘要的唯一事情是指令(可能是ngClick),它执行触发事件的代码(使用broadcast或emit),因为该指令将调用$apply
。 $apply
现在在{是$digest
上调用$rootScope
!你无法阻止这种行为。
因此,您所做的事情并不重要,您最有可能从$digest
开始$rootScope
周期。只要您没有严重的性能问题,就应该坚持下去并且不要尝试预先优化您的代码。