創建其唯一的目的是返回一個計算觀察到的一個功能。它可能需要參數。如果你希望它是一個雙向綁定,它必須是一個單獨的計算觀察值。
然後在你的綁定中,用適當的參數調用該函數。它返回的計算的觀察值將被綁定到你的視圖中,並且將像往常一樣更新。
這裏是a fiddle我用這種技術來創建事件處理程序。你可以在這裏做類似的事情。
通過使該函數成爲observable上的方法,您可以保持清潔。通過添加到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)"/>
Demo
然而,如果你只是想所有這些複選框可以將單個值綁定在你的視圖模型,你不」不需要那樣做。在您的視圖模型的數組上使用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([])
};
Demo
謝謝,這是非常好的。正是我在找什麼。 –