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