我有以下问题:
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;
});
但这看起来不太好......
在Knockout中执行此操作的正确方法是什么?
答案 0 :(得分:1)
你计算好了,它正在做它应该做的事情。
问题是这return !self.observables.isEditableReceivable() || !self.observables.aRNumber();
可能会导致短路评估。
如果!self.observables.isEditableReceivable()
结果为真,那么!self.observables.aRNumber()
不需要进行评估。尽管您更改了self.observables.aRNumber()
的值,但如果此行!self.observables.aRNumber()
仍为真,则它仍然无法到达此行!self.observables.isEditableReceivable()
。
选中fiddle。
点击"切换AR号"按钮永远不会触发计算,除非您单击"切换可编辑应收款"按钮第一。
=====================
编辑:我不知道这种答案是否应该在这里,或者我应该将其作为评论添加到问题中。但我只是等待mods:D答案 1 :(得分:1)
我和Knockout工作了很多,但还没有遇到过这个问题(令我惊讶的是,因为这是一个相当简单的问题)。
要回答您的问题:AFAIK您的解决方法的想法是唯一的选择。我只能想到其他语法的变化,或者可能会将其分解为实用方法。
如果你真的需要短路,例如为了提高效果,您可以查看these docs并使用$base_url = $request->getHost();
$app['monolog']->notice('Base path result', ['base_url' => $base_url])
。