2012-05-03 29 views
2

是否有任何簡單的方法來實現臨時禁用對象屬性或屬性的通知?Emberjs - 臨時禁用屬性更改通知

我知道你可以推遲他們與beginPropertyChanges()endPropertyChanges()但我不希望這些更改通知,直到我明確啓用它們。

預先感謝您。

使用案例: 我要設置一個對象(A)與另一個對象(B)的屬性。其他物體的幾種方法正在觀察B的性質。在某個時候,B對象的數據被清除,觀察者得到通知,稍後HTTP響應將它們設置爲有用的。我不希望觀察者在清除對象時得到通知,因爲那時屬性值無效。

+0

你能舉一個具體的例子,爲什麼你要這麼做?你的具體用例是什麼? – pangratz

+0

我不認爲有。查看觀察者的源代碼:https://github.com/emberjs/ember.js/blob/master/packages/ember-metal/lib/observer.js。我不完全理解所有這些工作的具體情況,但它看起來像你需要知道的一切。具體來說,'Ember._suspendObserver'和'Ember。_suspendListener',或者甚至是'Ember.removeObserver'。 –

回答

-1

這是一個古老的問題,但它在谷歌搜索暫停觀察員似乎很高,所以我會評論。

這樣的功能有明顯的用例,例如,對象的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的值將在觀察者有機會運行後重置。我不建議重置觀察器中的塞爾變量,因爲如果將屬性設置爲已有值,它將不會運行。

2

Ember不支持掛起通知。我強烈建議不要玩弄上述評論中提到的私人API。

我想知道爲什麼你在HTTP請求之前清理對象的數據?看起來很奇怪。

1

使用標誌將導致計算結果仍然觸發。

我想出的最好的方法是用最後一個已知值覆蓋計算結果。稍後,您可以通過再次設置計算出的屬性定義來啓用它。

let _myComputedProperty = Ember.computed('foobar', function() { 
    let foobar = this.get('foobar'); 
    console.log('myComputedProperty triggered >', foobar); 
    return '_' + foobar + '_'; 
}); 

Controller.extend({ 
    turnOffComputed: function() { 
    let myComputedProperty = this.get('myComputedProperty'); 
    this.set('myComputedProperty', myComputedProperty); 
    }, 

    turnOnComputed: function() { 
    this.set('myComputedProperty', _myComputedProperty); 
    } 
}) 

完整的示例:Conditional binding for a computed property