有几种类似的方法可以处理这个问题。基本思想是,您需要创建一个可写的计算可观察量来绑定复选框。
您可以使用扩展器直接在模型中执行此操作,或者通过向可观察基础 (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/ http://jsfiddle.net/rniemeyer/Kz4Tf/
为您visible
你可以做的绑定visible: !needsReview()