对foreach $ data变量的ko.computed写函数

时间:2012-09-04 03:43:47

标签: javascript html knockout.js

可以在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");
    }
});

1 个答案:

答案 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


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