0

出于示例目的,markAllCompleted 是否实现为计算?看起来复选框检查绑定应该是一个函数,并且 addItem 中的用法应该是一个常规的 observable。

只是真的很好奇。当谈到 Breeze 和 Knockout 时,我仍然相当笨拙......事实上,也许这是一个 Knockout 问题而不是 Breeze 问题......

(作为参考,我在下面包含了相关代码)

当我觉得答案应该很明显时,我讨厌问问题,但事实并非如此。我忍不住问道。

谢谢!

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

1 回答 1

3

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

此计算的(可以说)更合适的名称将类似于allItemsDone. 一个更简单的实现不会让你写入这个值(即它是一个简单的只读计算,在视图中它是一个只读复选框或等效项)。但是由于演示实现确实具有此功能(让用户选中/取消选中主复选框),因此计算也需要具有写入功能,但它可以保持计算状态,而不是简单的只读功能。

于 2013-01-16T00:26:08.673 回答