0

是否可以像这样在 foreach $data 变量上使用 ko.computed 写入函数?

<!-- 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");
    }
});
4

1 回答 1

2

问题是您计算出的 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">

小提琴


当然,这些不是您唯一的选择,您可能还可以在这里做其他事情,但这些都是您想到的。

于 2012-09-04T15:51:14.847 回答