4

モデルに、コンマ区切りの文字列を配列に分割するだけの計算プロパティがあり、「チェック済み」バインディングの特別な配列機能を利用して、計算プロパティを介して変更を書き戻せるようにしたいと考えています。

計算されたプロパティの読み取りにはすべてがうまく機能しますが、チェックボックスの1つをチェックするとすぐに、いくつかの機能がスプライスをサポートしていない(チェックを外した場合)またはプッシュをサポートしていない(チェックした場合)というエラーが表示されます。

> Uncaught TypeError: Object function
> h(){if(0<arguments.length)return"function"===typeof
> v?v.apply(d,arguments):j(Error("Cannot write a value to a ko.computed
> unless you specify a 'write' option. If you wish to read the current
> value, don't pass any parameters.")),this;n||g();b.r.Wa(h);return l}
> has no method 'splice' knockout-min.js:60 (anonymous function)

何が起こっているのかを説明するために、jsfiddle で簡単なサンプルを作成しました。http://jsfiddle.net/Y6tXw/

var MyModel = function() {
    this.src = ko.observable("one,two");
    this.comp = ko.computed({
        read: function() {
            return (this.src() || "").split(",");
        },
        write: function(value) {
            var csvs = (value || []).join(",");
            this.src(csvs);
        },
        owner: this
    });
};

var model = new MyModel();
ko.applyBindings(model);

私の書き込み機能を呼び出すことはありません。ビンディングでぶっ壊れそうです。私は何を間違っていますか?

4

2 に答える 2

4

上記の場合、comp は配列ではなく計算されます。私はあなたのコードを修正しました。subscribe を使用して、comp によって発生した変更通知をリッスンし、sec の値を再計算しました

<input type="checkbox" value="one" data-bind="{ checked: comp }"/>
<input type="checkbox" value="two" data-bind="{ checked: comp }"/>
<input type="checkbox" value="three" data-bind="{ checked: comp }"/>
<input type="text" data-bind="{ value: src }"/>


var MyModel = function () {

    var self = this;

    self.src = ko.observable("one,two");

    self.comp = ko.observableArray((self.src() || "").split(","));

    self.comp.subscribe(function () {
        self.src(ko.utils.unwrapObservable(self.comp).join(","));
    });
};

$(function () {
    var model = new MyModel();
    ko.applyBindings(model);
})
于 2013-02-01T03:42:03.077 に答える
2

Knockout は、バインド先が監視可能な配列であると想定しています。彼らがこのオプションをサポートするつもりはなかったと思います。(少なくともまだ)それを回避するには、代わりに別の方法を使用する方が簡単です. 配列を配列にし、src代わりに計算されたものにします。

function ViewModel(data) {
    this.comp = ko.observableArray(["one","two"]);
    this.src = ko.computed({
        read: function () {
            return this.comp().join(",");
        },
        write: function (value) {
            this.comp(value.split(","));
        },
        owner: this
    });
}
于 2013-02-01T03:47:11.707 に答える