計算されたオブザーバブルを返すことを唯一の目的とする関数を作成します。必要に応じてパラメーターを受け取ることができます。双方向バインディングにしたい場合は、別の計算されたオブザーバブルである必要があります。
次に、バインディングで、適切な引数を使用してその関数を呼び出します。返される計算されたオブザーバブルはビューにバインドされ、通常どおり更新されます。
これは、イベント ハンドラーを作成するためにこの手法を使用したフィドルです。ここで同様のことができます。
関数をオブザーバブルのメソッドにすることで、きれいに保つことができます。プロトタイプに追加するかko.observable.fn
、監視可能なインスタンスに直接追加します。
ko.observable.fn.bit = function (bit) {
return ko.computed({
read: function () {
return !!(this() & bit);
},
write: function (checked) {
if (checked)
this(this() | bit);
else
this(this() & ~bit);
}
}, this);
};
// or
function ViewModel() {
this.flags = ko.observable(0);
this.flags.bit = function (bit) {
return ko.computed({
read: function () {
return !!(this() & bit);
},
write: function (checked) {
if (checked)
this(this() | bit);
else
this(this() & ~bit);
}
}, this);
}.bind(this.flags);
}
次に、ビューに適用します
<input type="checkbox" data-bind="checked: flags.bit(0x1)"/>
<input type="checkbox" data-bind="checked: flags.bit(0x2)"/>
<input type="checkbox" data-bind="checked: flags.bit(0x4)"/>
<input type="checkbox" data-bind="checked: flags.bit(0x8)"/>
デモ
ただし、これらすべてのチェックボックスをビュー モデル内の単一の値にバインドしようとしているだけの場合は、その必要はありません。checked
ビュー モデルの配列でバインディングを使用し、チェックボックスに値を指定します。チェックされたすべての値が配列に追加されます。そして、それは双方向バインディングになります。
<input type="checkbox" data-bind="checked: checkedValues, value: 1"/>
<input type="checkbox" data-bind="checked: checkedValues, value: 2"/>
<input type="checkbox" data-bind="checked: checkedValues, value: 3"/>
<input type="checkbox" data-bind="checked: checkedValues, value: 4"/>
var viewModel = {
checkedValues: ko.observableArray([])
};
デモ