可以在foreach $ data变量上使用ko.computed write函数吗?
<!-- ko foreach: activeAttributes.optionsSplitted -->
<input type="text" data-bind="value: $data">
<!-- /ko -->
vm.activeAttributes.optionsSplitted = ko.computed({
read: function(){
return vm.activeAttributes().options().split("-*!*-");
},
write: function(){
alert("changed");
}
});
答案 0 :(得分:2)
问题是你的计算observable只检测数组activeAttributes.optionsSplitted
的变化。文本框绑定到各个项目,因此您实际上从未更改activeAttributes.optionsSplitted
的值,因此不会发出警报。
如果您希望能够这样做,您有几个选择。
绑定到change
事件以获取输入,这样您就可以在输入值发生变化时执行所需操作。
<input type="text" data-bind="value: $data, event: { change: $root.changed }">
(fiddle)
或者,您可以将值映射到包含可观察属性的对象,并在那里执行检查。您无法检测对象本身的更改(任何更改将是替换),因此您必须将值映射到具有可写计算属性的对象。
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">
(fiddle)
当然,这些不是你唯一的选择,你可以在这里做其他事情,但这些都是我想到的。