创建其唯一的目的是返回一个计算观察到的一个功能。它可能需要参数。如果你希望它是一个双向绑定,它必须是一个单独的计算观察值。
然后在你的绑定中,用适当的参数调用该函数。它返回的计算的观察值将被绑定到你的视图中,并且将像往常一样更新。
这里是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
谢谢,这是非常好的。正是我在找什么。 –