Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使淘汰计算订阅不在初始执行路径中的观测值?_Javascript_Knockout.js - Fatal编程技术网

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如何事先知道在结束时会有短路评估,然后在返回语句之前不执行语句。不需要解决方法。只要计算出短路,就不需要订阅其他观测值。它似乎订阅下一个可观察到的,一旦它到达它以后。