[英]Using a $apply inside a $watch
我有一個非隔離范圍指令。 我不想隔離它,因為它需要與其他指令一起位於元素上。 但是,我需要觀看有關范圍的項目。 所以我嘗試了這個:
scope.$watch(function() {
return scope.$apply(attrs.myAttribute);
}, function(val) {
return val ? doSomething():doSomethingElse();
});
這是行不通的,因為角度拋出一個摘要循環已在進行中錯誤。 所以我的問題是,如何使用非隔離指令動態觀察范圍內的項目。
謝謝,
如果項目已經在范圍內,則不能完全確定您在觀看項目時遇到的困難。 您能詳細說明一下嗎? 無論如何,這里有兩種解決方案應涵蓋幾乎所有情況。 要觀看屬性更改,請注意以下事項...
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
觀看屬性演示
你不想調用$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
為true時,將調用doSomething
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.