问题是您计算出的 observable 只检测到数组的变化,activeAttributes.optionsSplitted
. 文本框绑定到单个项目,因此由于您从未实际更改 的值activeAttributes.optionsSplitted
,因此不会发出警报。
如果您希望能够做到这一点,您有几个选择。
绑定到您的输入的change
事件,以便您可以在输入中的值更改时执行您想要的操作。
<input type="text" data-bind="value: $data, event: { change: $root.changed }">
(小提琴)
或者,您可以将值映射到包含可观察属性的对象并在那里执行检查。您无法检测到对象本身的更改(任何更改都将被替换),因此您必须将值映射到具有可写计算属性的对象。
self.activeAttributes.optionsSplitted = ko.computed(function(){
var options = self.activeAttributes().options().split("-*!*-");
return ko.utils.arrayMap(options, function (option) {
// does not work
//return ko.computed({
// read: function () { return option; },
// write: function (value) { alert('changed'); }
//});
return {
value: ko.computed({
read: function () { return option; },
write: function (value) { alert('changed'); }
})
};
});
});
然后绑定到属性。
<input type="text" data-bind="value: value">
(小提琴)
当然,这些不是您唯一的选择,您可能还可以在这里做其他事情,但这些都是您想到的。