使挖空计算订阅不在初始执行路径中的可观察量

Make Knockout computeds subscribe to observables not in initial execution path?

本文关键字:路径 执行 观察 计算      更新时间:2023-09-26

我有以下问题:

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;
});

但这看起来不太好...

在淘汰赛中做到这一点的正确方法是什么?

你的计算是可以的,它正在做它应该做的事情。问题是这种return !self.observables.isEditableReceivable() || !self.observables.aRNumber();可能会导致短路评估。

如果!self.observables.isEditableReceivable()结果为 true,则无需评估!self.observables.aRNumber()。即使你改变了多少self.observables.aRNumber()的值,它仍然不会到达这条线!self.observables.aRNumber()如果这条线仍然!self.observables.isEditableReceivable()结果为 true。

检查这个小提琴。

单击"切换

AR编号"按钮永远不会触发计算,除非您先单击"切换可编辑应收账款"按钮。

====

=================

编辑:我真的不知道这种类型的答案是否应该在这里,或者我应该将其作为评论添加到问题中。但我只会等待模组:D

我已经使用过Knockout很多次,但还没有遇到这个问题(令我惊讶的是,因为这是一个相当简单的问题)。

要回答您的问题:AFAIK 您的解决方法的想法是唯一的选择。我只能想到其他语法的变化,或者可能将其分解为实用方法的方法。

如果您确实需要短路,例如为了性能,您可以查看这些文档并利用ko.computedContext.isInitial()