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

重要なのは、計算されたオブザーバブルは配列の変更のみを検出するということですactiveAttributes.optionsSplitted。テキストボックスは個々のアイテムにバインドされているため、実際にの値を変更することはないため、activeAttributes.optionsSplittedアラートは作成されません。

これを実行できるようにする場合は、いくつかのオプションがあります。

入力のイベントにバインドしてchange、入力の値が変更されたときに必要なことを実行できるようにします。

<input type="text" data-bind="value: $data, event: { change: $root.changed }">

フィドル


または、監視可能なプロパティを含むオブジェクトに値をマップし、そこでチェックを実行することもできます。オブジェクト自体の変更を検出することはできないため(変更は置換になります)、writable-computedプロパティを使用して値をオブジェクトにマップする必要があります。

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 に答える