我有以下内容:
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设置计算函数的变化跟踪依赖关系的方式有关。您的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 });
但我认为设置每个可观察对象的订阅可能会更简洁(尽管不那么简洁)。