Javascript 使淘汰计算订阅不在初始执行路径中的观测值?
我有以下问题:Javascript 使淘汰计算订阅不在初始执行路径中的观测值?,javascript,knockout.js,Javascript,Knockout.js,我有以下问题: self.observables.disableDeleteNumberButton = ko.computed(function () { return !self.observables.isEditableReceivable() || !self.observables.aRNumber(); }); 由于初始化计算值时未对self.observables.aRNumber进行评估,因此计算值似乎未订阅此可观察值的更改 我可以通过以下方式强制进行评估: self
self.observables.disableDeleteNumberButton = ko.computed(function () {
return !self.observables.isEditableReceivable() || !self.observables.aRNumber();
});
由于初始化计算值时未对self.observables.aRNumber
进行评估,因此计算值似乎未订阅此可观察值的更改
我可以通过以下方式强制进行评估:
self.observables.disableDeleteNumberButton = ko.computed(function () {
var editableReceivable = self.observables.isEditableReceivable();
var aRNumber = self.observables.aRNumber();
return !editableReceivable || !aRNumber;
});
但这看起来不太好
在淘汰赛中,正确的做法是什么?你的计算机没问题,它正在做它应该做的事情。 问题是这个
返回!self.observables.ISeditableReceives()| | |!可观察到的自我代码>可能导致短路评估
如果!self.observables.iseditableReceive()
结果为true,然后是!self.observables.aRNumber()
不需要计算。即使您对self.observables.aRNumber()的值更改了多少,它仍然不会到达这一行!self.observables.aRNumber()
如果此行!self.observables.ISeditableReceive()
的结果仍然为true
看看这个
单击“切换应收账款编号”按钮将永远不会触发计算结果,除非您首先单击“切换可编辑应收账款”按钮
=====================
编辑:我真的不知道这种类型的答案应该在这里,还是应该添加它作为问题的注释。但是我将等待mods:D我已经使用过Knockout很多次了,但还没有遇到这个问题(这让我很惊讶,因为这是一个相当简单的问题)
回答你的问题:好吧,你的变通方法是唯一的选择。我只能想到其他语法的变体,或者可能是将其分解为实用方法的方法
如果您确实需要短路(例如性能),您可以检查并利用ko.computedContext.isInitial()
您是对的。。它在init时不订阅第二个可观测值,但在稍后阶段到达它时会订阅。所以它毕竟不会带来问题。是的,但这个答案并不能真正回答knockout如何事先知道在结束时会有短路评估,然后在返回语句之前不执行语句。不需要解决方法。只要计算出短路,就不需要订阅其他观测值。它似乎订阅下一个可观察到的,一旦它到达它以后。