Knockout.js:当可观察数组中的值发生变化时,触发计算的最佳方式是什么

cuxqih21  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(126)

我们有一个包含可观察属性(描述、数量、类型)的对象的observableArry。
这些物料在全局列表中维护,称为补充物料。
这些项目可以添加到预算的行中。每行可以包含0个或多个辅助项目,但每个项目只能包含一个,不能重复。
预算行项目有一个单位成本值和一个补充合计列。后者的计算如下

  1. this.suppitems().reduce((total, current) => current.isBillable() ? current.quantity() * this.unitcost() : 0, 0)

换句话说,如果“辅助物料类型”为“可开单”,则将其数量乘以预算行物料的单位成本,然后将其与该行的“辅助物料成本”合计相加。
还有一个列用于跟踪分配给该行的辅助物料合计(其数量之和)。计算方法如下

  1. this.suppitems().reduce((total, current) => total + +current.quantity(), 0)

所有这些都很好-当您在行的“供应商物料列表”中添加/删除“供应商物料”时,“供应商物料”的物料合计和总成本都会更新。
但是,如果已分配给行的供应商物料的数量被更新,则仅更新供应商物料合计(物料数)-不会触发第一个计算(计算总成本)。
一个选项是将可观察对象添加到供应商项目列表对象(管理供应商项目的observableArray的父项),并将其称为“hasChanged”。在供应商项目对象中,订阅数量值,并在数量值发生更改时通知父项列表,父项列表进而更新其hasChanged值。
行项订阅hasChanged,当它触发时,调用一个方法来重新计算行的总计。这是可行的,但我想知道是否有更优雅的方法来解决这个问题?

mwyxok5s

mwyxok5s1#

我找到了上面的解决办法。
如图所示的计算功能确实工作-问题是Firefox开发人员版本-不确定原因是什么,但当在所有其他浏览器(包括普通Firefox)中测试时-问题没有表现出来。

相关问题