如何在 Ember 2.3 中获取 BeforeObserver 等效项



为了解决这个问题,我必须澄清一下,在过渡到 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
})

当然,在第一次运行中,_oldPropundefined,但这是意料之中的,对吧?这是第一次改变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);
  }
})

不幸的是,目前我不知道在新余烬中执行此操作的更好方法。

最新更新