Ember 4.x(Octane)-替代Observers?

2w3rbyxf  于 2024-01-07  发布在  其他
关注(0)|答案(1)|浏览(123)

我几乎完成了从2.13一直到最新LTS版本4.12的一个非常旧的Ember.js项目的升级。沿着我一直在努力掌握Octane版本带来的变化,我正在努力适应的一个领域是我们对观察者的使用。
我们在两个文件中使用观察者来在观察值发生变化时触发函数调用。我知道Octane不鼓励使用观察者,所以如果可能的话,我想从它们中迁移出来。
我的理解是,跟踪属性现在是最重要的;它们在很大程度上是为了取代计算属性,我假设其他基于状态的函数,如观察器,但我真的不确定如何在这个用例中应用它们,或者是否可能。
我的问题是:在Ember Octane(4.x+)中是否有观察员的首选替代品?

EDIT下面是我们如何使用观察者的一个例子。它非常简单:如果模型中的标记属性发生变化,则调用service函数:

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
  }
});

字符串

58wvjzkj

58wvjzkj1#

在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
  }
});

字符串
我想指出的是,任何数据层都不应该进入应用程序,这种行为应该反过来(这有很多原因,这超出了这个SO问题的范围!,但这就是为什么你在大型应用程序中看到整个数据层是一个单独的包-它 * 强制 * 这个约束,因为包/库可能不会假设它们在哪里被消费)。

解决方案

无论serialNumber发生了什么变化,都应该调用trackSerialNumberUpdated(theModel)

相关问题