为什么markAllCompleted在Breeze TODO样本中是“计算的”?

时间:2013-01-15 23:39:12

标签: knockout.js breeze

将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">

1 个答案:

答案 0 :(得分:3)

我认为这里的混淆主要是由于计算值markAllCompleted的命名不正确造成的。您描述的替代方法(将单击绑定到函数)与按钮(无状态)相关,而不是与复选框(具有自己的状态,true或false)相关。

这个(可以说)这个计算的更合适的名称就像allItemsDone。一个更简单的实现不会让你写入这个值(即它是一个简单的只读计算,并在视图中它是一个只读复选框或等效)。但是,由于演示实现 具有此功能(让用户选中/取消选中master复选框),所以计算出来的也需要具有写入功能,但它可以保持计算,而不是简单只读一个。