Ember 计算属性是不是意味着与/包含异步代码一起使用? [关闭]

Posted

技术标签:

【中文标题】Ember 计算属性是不是意味着与/包含异步代码一起使用? [关闭]【英文标题】:Were Ember Computed Properties meant to be used with / contain asynchronous code? [closed]Ember 计算属性是否意味着与/包含异步代码一起使用? [关闭] 【发布时间】:2017-12-23 18:48:18 【问题描述】:

我是一位经验丰富的 Ember.js 开发人员。在指南中,我们可以找到一个具有全名的计算属性示例(同步、简单、依赖于名字和姓氏)。然而,在野外,我们可以发现大量以异步方式使用计算属性(例如,在 promise 解析后设置自身 - 而第一次运行并获取返回 undefined)。

我看到这个异步计算属性越多,我就越想知道 - 计算属性是否意味着要与异步代码一起使用?不是自找麻烦吗?

一个常见问题是其他计算属性 (CP2) 依赖于异步 CP1。 CP2 得到 CP1 但它得到undefined(因为 CP1 将在稍后设置它的值,因为它是异步的)。 CP2 以错误的 CP2 值 (undefined) 完成计算。 CP1 自行设置,但 CP2 不再重新计算(即使 CP1 已更改),因为模板中未引用 CP2(这意味着它已绑定并且始终需要其值,总是在 CP1 更改时重新计算)-而是被一些 javascript 调用引用。

这方面的实际示例可能是根据订单中的商品计算总订单(来自电子商务商店)价格。计算属性依赖于与项目的异步关系,其中可能包含其他异步关系,如税款类型。

【问题讨论】:

【参考方案1】:

我假设您的意思是混合计算属性和承诺。如果你这样做,那么不要。我多次偶然发现这个问题。我发现它有问题,尤其是对于深层嵌套关联。

我也在电子商务网站上工作。最初,我发现网站渲染时很多计算都没有得到解决。原因是我将 Promise 传递给了计算属性(用于计算)。后来,我意识到我应该先解决所有关系,然后再将结果传递给计算逻辑。我在服务中做了这一步。一个例子来说明我的意思:

假设订单有很多商品,您要计算总价,价格是商品中的一个字段。

代替:

total: Ember.computed("order.items.@.price", function() 
  return this.get("order.items").reduce((sum, obj) => 
    return sum + obj.get("price");
  );
);

我这样做:

total: Ember.computed("items.@.price", function() 
   return this.get("items").reduce((sum, obj) => 
     return sum + obj.get("price");
   );
);

items 在上面某处作为 Promise 结果传入。

我发现这个post 很好地解释了why-you-should-not

不久前我很想问类似的问题。渴望听到更多关于此的想法。

【讨论】:

我没有使用过这种格式的items.@.price,这是有效的吗? items.@each.price这有什么区别吗? 哦,打错了,应该是@each :),你是对的 我不同意您的解决方案,但我发现您的其他答案很有价值。将等待更多的想法。 :)

以上是关于Ember 计算属性是不是意味着与/包含异步代码一起使用? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ember 计算属性只在 ember 检查器中执行一次?

Ember.js、set() 和计算属性

如何将过滤后的计算属性与 ember-drag-drop 可排序对象一起使用?

Ember.JS - 无法根据计算属性进行过滤或过滤

用于从 hasMany 关系中检索一条记录的 Ember 计算属性?

Ember 计算属性在绑定到深度嵌套的属性时不会触发