1

我有一个非隔离范围指令。我不想孤立它,因为它需要与其他指令的元素。然而,我需要在范围上观看一件物品。所以我试过这个:

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

这不起作用,因为角度抛出一个摘要循环已经在进行中的错误。所以我的问题是,我怎样才能动态观察范围内的项目与非隔离指令。

感谢,

回答

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

+0

对不起,但我不相信这个作品。如何调用'scope。$ watch(attrs',如果范围内没有任何东西?你不能仅仅看这种风格的属性,而且OP不需要隔离范围 - 所以在指令级定义一个范围定义如果我解释这个答案,你可以编写一个这样的小工作演示吗?[这是一个JSFiddle](https://jsfiddle.net/rqej2b4j/)。你可以使这个功能? – scniro

+0

@scniro在我的项目指令是在控制器的范围内,所以我需要指令来监视已经在范围中定义的东西,但是动态地这样做,例如,如果控制器定义了scope.foo,我需要我的元素像所以每当foo改变我的指令都可以采取相应的行动,我肯定也会得到你的答案,但我不希望属性被解释为一个字符串。 – user3828000

+0

但是'myAttr =“foo”'不会从指令内部被监视 - 它仅仅是一个属性,并且没有任何限制。你如何把它放在范围上? @ user3828000。 ''范围。$ watch(attrs.myAttr,''总是会产生'undefined',所以在上面的例子中,我会怀疑doSomethingElse()总是会激发 – scniro

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