這是一個古老的問題,但它在谷歌搜索暫停觀察員似乎很高,所以我會評論。
這樣的功能有明顯的用例,例如,對象的enum屬性由列表框表示,並且對象可能會更改。如果使用列表框從服務器請求屬性更改併成功設置新值,則自然的做法是在列表框中使用控制器屬性,在對象更改時將該屬性設置爲對象屬性,並觀察它向服務器發出請求。在這種情況下,只要對象發生變化,觀察者就會收到不需要的通知。
但是,我同意這些用例非常多樣化,以至於Ember無法支持它們。
因此,可能的解決辦法是在控制器中聲明一個變量並使用它,每次更改屬性,這樣你才反應過來由用戶所做的更改:
doNotReact: false,
updateManually: function() {
this.doNotReact = true;
Ember.run.scheduleOnce('actions', this, function() {
this.doNotReact = false;
});
............
this.set('something', somevalue);
............
},
onChange: function() {
if (this.doNotReact) return;
...............
}.observes('something')
doNotReact的值將在觀察者有機會運行後重置。我不建議重置觀察器中的塞爾變量,因爲如果將屬性設置爲已有值,它將不會運行。
你能舉一個具體的例子,爲什麼你要這麼做?你的具體用例是什麼? – pangratz
我不認爲有。查看觀察者的源代碼:https://github.com/emberjs/ember.js/blob/master/packages/ember-metal/lib/observer.js。我不完全理解所有這些工作的具體情況,但它看起來像你需要知道的一切。具體來說,'Ember._suspendObserver'和'Ember。_suspendListener',或者甚至是'Ember.removeObserver'。 –