使用油门时可观察到的敲除未触发

时间:2019-02-22 20:36:00

标签: knockout.js knockout-3.0

我有以下内容:

self.periodicallySave = ko.computed(function () {
    if (self.optionA() || self.optionB() || self.optionC()) {
        self.saveOptions();
    }
}).extend({ throttle: 1000 });

我正在使用此计算功能来在文本字段更新时定期保存它们。这些文本字段为textareas,如下所示:

    <textarea rows="2" data-bind="textInput: optionA"></textarea>

除了optionAselect

            <select data-bind="value: optionA">
                <option>Foo</option>
                <option>Bar</option>
            </select>

由于某种原因,只有OptionA触发了我计算得出的可观察值;改变其他人没有效果。我是不是误解了可计算的观测值是如何工作的?我的期望是,如果这些可观察值中的任何一个发生更改,则该函数将被触发。

更新

如果我使用+而不是||,它会按预期工作。奇怪的是OR似乎停止了可观察的链条;尤其是因为optionAselect,只能包含两个值之一。删除optionA也会产生预期的结果。

1 个答案:

答案 0 :(得分:3)

我认为这与敲除为计算函数设置更改跟踪依赖关系的方式有关。您的3个选项可观察值都在IF语句中,因此,如果第一个选项以true开头,则后两个条件会短路并且不会评估。由于未对它们进行评估,因此淘汰赛永远不会绑定到他们。

在我看来,以这种方式使用的可计算的可观察值有些危险,因为它通常具有意想不到的副作用。您可以通过先将可观察对象展开为变量,然后再检查它们的值来轻松地“修复”此行为:

self.periodicallySave = ko.computed(function () {
    var a = self.optionA();
    var b = self.optionB();
    var c = self.optionC();

    if (self.optionA() || self.optionB() || self.optionC()) {
        self.saveOptions();
    }
  }).extend({ throttle: 1000 });

但是我认为为每个可观察对象设置订阅可能会更简洁(尽管不太简洁)。