创建一个函数,其唯一目的是返回一个计算的 observable。它可以根据需要接受参数。如果您希望它是双向绑定,它必须是一个单独的计算 observable。
然后在您的绑定中,使用适当的参数调用该函数。它返回的计算出的 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)"/>
演示
但是,如果您只是尝试将所有这些复选框绑定到视图模型中的单个值,则不需要这样做。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([])
};
演示