2016-02-11 21 views
0

要前言本,我必須澄清,我現在用的是傳統的控制器和傳統視圖的過渡時期,而轉變爲灰燼2.3,在這裏找到:如何獲取Ember 2.3中的BeforeObserver等效項?

https://github.com/emberjs/ember-legacy-controllers

現在,我有一個屬性在我的(傳統)控制器上稱爲currentTopPost。

在餘燼1.7,我有這樣的設置:

// before observer 
currentTopPostBeforeObserver: function(){ 
... 
}.observesBefore('currentTopPost'), 

// observer 
currentTopPostBeforeObserver: function(){ 
... 
}.observes('currentTopPost'), 

我是有這種方式,當currentTopPost改變的原因,我想它保存舊topPost它切換它的值之前到新的屬性,因爲它是一個Post對象(我有一個Post模型)。

當然,在1.7中,我將舊帖子保存在beforeObserver中,然後在觀察者中做了其他任何我必須做的事情。現在,在Ember 2.3中,我有這樣的設置:

currentTopPostObserver: Ember.observer('currentTopPost', function(){ 
... 

}), 

對於使用新值執行函數的情況下,它可以正常工作。但是我已經失去了在價值改變之前處理行動的能力。現在根據這個問題的答案:

How can an observer find out the before and after values of the observed property in Ember.js?

observesBefore功能已被棄用,我們應該跟隨這名:但是

doSomething: Ember.observer('foo', function() { 
    var foo = this.get('foo'); 
    var oldFoo = this.get('_oldFoo'); 

    if (foo === oldFoo) { return; } 

    // Do stuff here 

    this.set('_oldFoo', foo); 
}) 

,就試圖用this.get( 「_oldCurrentTopPost」),我什麼也沒得到。如何在更改之前訪問此屬性的舊值?

回答

0

據我所知,沒有特別好的方法可以讓機制恢復。在許多情況下,觀察者本身「被認爲是有害的」,但我會盡我所能爲您提供一種實用的替代解決方案。

做到這一點,我能想到的最好的快速和相對骯髒的方法是與getter和setter做一個「代理」計算屬性。在setter中,你可以獲得「真實」屬性的前一個值,調用函數來做任何事情,然後在不動產上設置新值。

這裏,你可以用一個例子:

myProxyProperty: Ember.computed('myRealProperty', { 
    get() { 
    return this.get('myRealProperty'); 
    }, 
    set(key, value) { 
    const oldValue = this.get('myRealProperty'); 

    this.doSomethingWithOldValue(oldValue); 

    this.set('myRealProperty', oldValue); 
    } 
}) 

不幸的是,我不知道此刻在新的灰燼這樣做的更好的方法。

+0

我建議以上Miguel的方法去,我會在這裏雖然離開這個作爲一種替代。 –

+0

我想上面想要做'this.set('myRealProperty',value)'。事實上,我認爲它會保持舊的價值,從不設置新的 – shane

3

我作爲一個替代使用方法是:

propWillChange(prop) { 
    //your new before observer 
}, 

propDidChange: Ember.observer('prop', function() { 

    let prop = this.get('prop'); 

    if (this._oldProp !== prop) { 
    this.propWillChange(this._oldProp); 
    this._oldProp = prop; 
    } 

    //Do stuff 

}) 

當然,在第一次運行,_oldPropundefined,但是這預期的,對不對?這是第一次prop正在改變。

我也不同意不應該使用觀察者。我同意觀察員應儘可能避免,因爲許多人不完全掌握他們的副作用,但在許多情況下,他們非常有用,特別是在構建第三方插件集成時。

由於問題具體詢問beforeObserver替換,所以在這裏。但是,如果可能的話,我建議重新考慮是否可以在沒有觀察員的情況下重建您的用例。

顫聲:https://ember-twiddle.com/045b7b9c1562ceb6bbdc

+0

我應該使用術語「應儘可能避免」而不是「有害」,我也喜歡這種方法。 –

+0

我試圖實現這一點 - 我喜歡這種方式,順便說一句 - 但我無法訪問舊的道具。 我試過了:this._oldProp,this._oldCurrentTopPost,this.get(「_ oldCurrentTopPost」)和this.get(「_ oldProp」)。我想我搞亂了命名約定或者什麼。 我去了觀察屬性的名稱,在這種情況下'currentTopPost',並嘗試添加'舊'。另外,我測試了它從未定義到首先選擇,然後選擇第二個,但所有'oldProp的仍然未定義。 – Darshan

+0

@Darshan我已經更新了答案,以證明它的效果。我還更新了一些遺漏的關於「觀察員」功能的缺失paren。 – miguelcobain

相關問題