簡體   English   中英

在$ watch中使用$ apply

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM