我有以下内容:
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
也会产生预期的结果。
答案 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 });
但是我认为为每个可观察对象设置订阅可能会更简洁(尽管不太简洁)。