Ember 4.x (Octane) - 观察者的替代品?

问题描述 投票:0回答:1

我即将完成将一个非常旧的 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.js
1个回答
0
投票

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)

© www.soinside.com 2019 - 2024. All rights reserved.