0

我有一个非隔离范围指令。我不想隔离它,因为它需要在带有其他指令的元素上。然而,我需要在范围内观看一个项目。所以我尝试了这个:

scope.$watch(function() {
     return scope.$apply(attrs.myAttribute);
}, function(val) {
     return val ? doSomething():doSomethingElse();
});

这不起作用,因为 Angular 引发了一个摘要循环已经在进行中的错误。所以我的问题是,如何使用非隔离指令动态观察范围内的项目。

谢谢,

4

2 回答 2

2

如果它已经在范围内,则不完全确定您在观看该项目时遇到的困难。你能详细说明一下吗?无论如何,这里有两个解决方案应该涵盖几乎所有情况。要观察属性变化,请注意以下...

scope.$watch(function() {
    return elem.attr('my-attribute');
}, function(n, o) {
    if(n) 
        console.log(n);
});

JSFiddle Link - 观看属性演示


但是,我怀疑您很难将项目放在范围内。如果是这样,这是一种分配它的方法,$observe然后在没有隔离的情况下从那里观看...

attrs.$observe('myAttribute', function(value) {
    scope.myValue = value;
});

scope.$watch('myValue', function(n, o) {
    if(n) 
        console.log(n);
});

JSFiddle Link - 通过观看属性演示$observe

于 2015-10-20T18:16:44.213 回答
1

您不想$apply$watch回调内部调用,因为scope.$watch内部会调用$apply您,这就是为什么您会收到“摘要循环已在进行中的错误”错误。

相反,您可以简单地执行以下操作:

scope.$watch(attrs.myAttribute, function(val){
  return val ? doSomething() : doSomethingElse();
};

设置为的表达式myAttribute将根据您的指令所在的元素的范围进行评估,因为就像您提到的那样,它不是孤立的。当返回值改变时,回调函数将被调用。

例如,如果您的 HTML 看起来像这样

<div myNoNewScopeDirective myAttribute="doThis(value)"></div>

doThis(value)将根据与 div 元素关联的范围进行评估,并且您的myNoNewScopeDirective. 因此,对此类值的任何更改都将触发您提供的回调,并且当val为真时,doSomething将被调用。

于 2015-10-20T18:32:03.697 回答