ko.computed不使用动态添加的属性

时间:2013-11-18 09:37:27

标签: knockout.js

我编写了如下代码。

var ModalInit = function (serverModel, element) {
    var dailyReport = new DailyMasterReport();
    $.extend(true, dailyReport, ko.mapping.fromJS(serverModel));

    dailyReport.SelectAll = ko.computed({
        read: function () {

            var isAllSelected = true;
            ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
                isAllSelected = isAllSelected && item.PodAvailable
            });
            return isAllSelected;
        },
        write: function (newValue) {

            if (newValue) {
                ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
                    item.PodAvailable(true);
                });
            } else {
                ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
                    item.PodAvailable(false);
                });
            }
        },
        owner: DailyMasterReport
    });

    ko.applyBindings(dailyReport, $(element)[0]);

};

在上面的代码中,当我更改可用pod中的复选框时,它不会更新计算值。如果我在viewModel中编写计算逻辑,那么它会给出错误。

任何人都可以为这个问题提供解决方案。

1 个答案:

答案 0 :(得分:0)

PodAvailable是一个可观察的,因此您需要在read函数中展开它:

    read: function () {
        var isAllSelected = true;
        ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
            isAllSelected = isAllSelected && item.PodAvailable();
        });
        return isAllSelected;
    },

您可能也有兴趣改进此功能,因为它目前始终会检查每个项目以供选择。但是你真的只需要知道一个项目未被选中以返回false。例如,如果未选中每个项目,则只需检查第一个项目。这是一个更有效的更新版本:

    read: function () {
        return ko.utils.arrayFirst(dailyReport.AvailablePods(), function (item) {
            return !item.PodAvailable();
        }) == null;
    },