有几种类似的方法可以处理这个问题。基本思想是你需要创建一个可写的计算 observable 来绑定复选框。
您可以直接在模型中执行此操作,使用扩展器,或通过向可观察基础 (ko.observable.fn) 添加函数。
但是,由于您使用的是映射插件,并且可能不想自定义创建对象的方式或添加其他属性,因此我认为使用自定义绑定是最佳选择。你的模型真的不需要关心维护你的属性的逆,所以我们实际上可以在绑定时做这部分。
这是一个inverseChecked 绑定,它在您的真实可观察对象和绑定之间插入一个可写的计算可观察对象。然后,它只是使用真正的检查绑定来完成它的工作。
ko.bindingHandlers.inverseChecked = {
init: function(element, valueAccessor, allBindingsAccessor) {
var value = valueAccessor();
var interceptor = ko.computed({
read: function() {
return !value();
},
write: function(newValue) {
value(!newValue);
},
disposeWhenNodeIsRemoved: element
});
var newValueAccessor = function() { return interceptor; };
//keep a reference, so we can use in update function
ko.utils.domData.set(element, "newValueAccessor", newValueAccessor);
//call the real checked binding's init with the interceptor instead of our real observable
ko.bindingHandlers.checked.init(element, newValueAccessor, allBindingsAccessor);
},
update: function(element, valueAccessor) {
//call the real checked binding's update with our interceptor instead of our real observable
ko.bindingHandlers.checked.update(element, ko.utils.domData.get(element, "newValueAccessor"));
}
};
这是一个示例:http://jsfiddle.net/rniemeyer/Kz4Tf/
对于您的visible 绑定,您可以执行visible: !needsReview()