2016-02-11 31 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

相关问题