使用油门时,Knockout observable不会触发

问题描述 投票:1回答:1

我有以下内容:

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>

除了optionA这是一个select

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

出于某种原因,只有OptionA触发我的计算可观察量;改变其他人没有任何影响。我是否误解了计算的可观察量是如何工作的?我的期望是,如果任何这些可观察的变化,将触发该功能。

更新:

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

knockout.js knockout-3.0
1个回答
3
投票

我认为这与knockout设置计算函数的变化跟踪依赖关系的方式有关。您的3个选项observable都在IF语句中,因此如果第一个选项以true开头,则后两个条件会被短路并且不会被评估。由于他们没有被评估,淘汰赛从未与他们结合。

在我看来,使用这种方式计算的可观察量有点危险,因为它经常会产生意想不到的副作用。您可以通过在检查其值之前首先将observable展开为变量来轻松“修复”此行为:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.