Make Knockout计算器是否订阅了不在初始执行路径中的observable?

时间:2016-02-19 08:30:26

标签: javascript knockout.js

我有以下问题:

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中执行此操作的正确方法是什么?

2 个答案:

答案 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])