我即将完成将一个非常旧的 Ember.js 项目从 2.13 一直升级到最新的 LTS 版本 4.12。一路走来,我一直在努力应对 Octane 版本带来的变化,而我正在努力适应的一个领域是我们对观察者的使用。
我们在两个文件中使用观察者来在观察值发生变化时触发函数调用。我知道 Octane 不鼓励观察者,所以如果可能的话我想远离他们。
我的理解是,跟踪的属性现在才是最重要的;它们主要是为了替换计算属性,并且我假设其他基于状态的函数,例如观察者,但我不太确定如何在这个用例中应用它们,或者是否可能。
我的问题是:Ember Octane (4.x+) 中是否有观察者的首选替代品?
编辑 这是我们如何使用观察者的示例。这非常简单:如果模型中标记的属性发生变化,则调用服务函数:
import Model, { attr } from '@ember-data/model';
import { observer } from '@ember/object';
import { service } from '@ember/service';
export default Model.extend({
tracking: service(),
serialNumber: attr('string'),
...
serialNumberChanged: observer('serialNumber') {
this.tracking.trackSerialNumberUpdated(this); // The service function
}
});
Ember Octane (4.x+) 中是否有观察者的首选替代品?
不是直接。 观察者是一种反模式,通常出于性能原因,因为它们往往被用作“效果”,这会导致额外的渲染,并可能显着减慢应用程序的速度,尤其是在频繁调用的情况下。
更换它们很大程度上取决于它们的用途。
对更新的回应:
给出这段代码:
import Model, { attr } from '@ember-data/model';
import { observer } from '@ember/object';
import { service } from '@ember/service';
export default Model.extend({
serialNumber: attr('string'),
...
serialNumberChanged: observer('serialNumber') {
this.tracking.trackSerialNumberUpdated(this); // The service function
}
});
我想指出,any数据层永远不应该到达out进入您的应用程序,并且这种行为应该被反转(造成这种情况的原因有很多,这超出了这个SO问题的范围!但这就是为什么您会在较大的应用程序中看到,整个数据层是一个单独的包 - 它强制这个约束,因为包/库可能不会对它们的消费位置做出假设)。
解决方案?:
无论发生什么变化,
serialNumber
也应该致电trackSerialNumberUpdated(theModel)