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-drag-drop 可排序对象一起使用?