将markAllCompleted实现为计算目的吗?似乎复选框检查绑定应该是一个函数,addItem中的用法应该是常规的observable。
真的很好奇。当谈到Breeze和Knockout时,我仍然相当吵闹......事实上,这可能是一个Knockout问题,而不仅仅是一个微风问题......
(供参考,我已在下面列出相关代码)
当我觉得答案显而易见时,我讨厌提问,但事实并非如此。我忍不住要求。
谢谢!
function addItem() {
var item = dataservice.createTodo();
item.IsDone(vm.markAllCompleted());
item.Description(vm.newTodo());
item.CreatedAt(new Date());
if (item.entityAspect.validateEntity()) {
extendItem(item);
vm.items.push(item);
dataservice.saveChanges();
vm.newTodo("");
} else {
handleItemErrors(item);
}
}
vm.markAllCompleted = ko.computed({
read: function () {
var state = getStateOfItems();
return state.itemsLeftCount === 0 && vm.items().length > 0;
},
write: function (value) {
suspendItemSave = true;
vm.items().forEach(function (item) {
item.IsDone(value);
});
suspendItemSave = false;
dataservice.saveChanges();
}
<input id="markAll" type="checkbox" data-bind="checked: markAllCompleted">
答案 0 :(得分:3)
我认为这里的混淆主要是由于计算值markAllCompleted
的命名不正确造成的。您描述的替代方法(将单击绑定到函数)与按钮(无状态)相关,而不是与复选框(具有自己的状态,true或false)相关。
这个(可以说)这个计算的更合适的名称就像allItemsDone
。一个更简单的实现不会让你写入这个值(即它是一个简单的只读计算,并在视图中它是一个只读复选框或等效)。但是,由于演示实现 具有此功能(让用户选中/取消选中master复选框),所以计算出来的也需要具有写入功能,但它可以保持计算,而不是简单只读一个。