使用没有DOM事件的knockout observable,如何构建一对可写计算

时间:2015-12-17 23:33:35

标签: knockout.js

我有一个简单的表,其中两个输入列绑定到视图模型(vm)。假设其中一个属性是vm.ColA,另一个属性是vm.ColB。

还有其他一些列,所以我使用了

ko.mapping.fromJS(data, {}, this);

为每个属性创建observable。但是,ColA和ColB必须能够接受输入,当它们发挥作用时,会影响另一个。例如,假设有一个因子属性(ColA * Factor = ColB)和(ColA = ColB / Factor)。

我需要能够在ColA中输入一个值并让它计算ColB,但是如果我在ColB中输入一个值,它应该计算ColA。

我已经查看了可写的计算可观察量,但到目前为止,我还没有找到一个关于两个以这种方式相互影响的属性的例子或讨论。

1 个答案:

答案 0 :(得分:0)

要实现这种依赖关系,您需要explicitly subscribecolA来修改colB值,如果它发生变化,反之亦然。

colA.subscribe(function(newValue) {
    colB( /* calculation based upon colA newvalue */);
});

问题是因为colA取决于colB而反之,你可以进入无限循环(除非计算是精确的,并且在进行计算时值不会改变,没有保证)。即当您更改colA订阅更改colB时,其订阅会更改colA,依此类推。

为了避免这种递归,您可以实现这样的解决方案:Change observable but don't notify subscribers in knockout.js或类似的东西。问题是,当colA更改colB时,colA不应通过colB更改通知。

另一种可能的解决方案是检查计算结果是否与其他可观察值中的值大致相等,在这种情况下,您不会更改它以打破循环。即如果在colB更改时计算colA的结果大约等于colB中的值,则不会更改colB中的值。