为了解决这个问题,我必须澄清一下,在过渡到 Ember 2.3 时,我正在使用遗留控制器和过渡时期的遗留视图,可在此处找到:
https://github.com/emberjs/ember-legacy-controllers
现在,我的(旧版(控制器上有一个名为currentTopPost的属性。
在 Ember 1.7 中,我有这样的设置:
// before observer
currentTopPostBeforeObserver: function(){
...
}.observesBefore('currentTopPost'),
// observer
currentTopPostBeforeObserver: function(){
...
}.observes('currentTopPost'),
我这样做的原因是,当当前 TopPost 更改时,我希望它在将其值切换到新属性之前保存旧的 topPost,因为它是一个 Post 对象(我有一个 Post 模型(。
当然,在 1.7 中,我将旧帖子保存在 beforeObserver 中,然后在观察器中执行其他任何操作。现在,在 Ember 2.3 中,我有这样的设置:
currentTopPostObserver: Ember.observer('currentTopPost', function(){
...
}),
就使用新值执行功能而言,这工作正常。但是我已经失去了在值更改之前处理操作的能力。现在根据这个问题的答案:
观察者如何找出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"(时,我一无所获。如何在此属性更改之前访问此属性的旧值?
我用作替代品的是:
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
})
当然,在第一次运行中,_oldProp
会undefined
,但这是意料之中的,对吧?这是第一次改变prop
。
我也不同意不应该使用观察者。我同意如果可能的话,应该避免观察者,因为许多人并没有完全掌握它们的副作用,但在许多情况下,它们非常有用,尤其是在构建第三方插件集成时。
由于这个问题专门询问了 beforeObserver 的替换,所以就在这里。但是,如果可能的话,我建议重新考虑是否可以在没有观察者的情况下重建您的用例。
叽叽喳喳:https://ember-twiddle.com/045b7b9c1562ceb6bbdc
据我所知,没有特别好的方法可以让这种机制恢复。 在许多情况下,观察者本身"被认为是有害的",但我会尽力给你一个实用的替代解决方案。
我能想到的最好的快速且相对肮脏的方法是使用 getter 和 setter 创建一个"代理"计算属性。 在 setter 中,您可以获取 "real" 属性的先前值,调用函数来执行任何操作,然后在 real 属性上设置新值。
下面是您可以使用的示例:
myProxyProperty: Ember.computed('myRealProperty', {
get() {
return this.get('myRealProperty');
},
set(key, value) {
const oldValue = this.get('myRealProperty');
this.doSomethingWithOldValue(oldValue);
this.set('myRealProperty', oldValue);
}
})
不幸的是,目前我不知道在新余烬中执行此操作的更好方法。