0

我正在尝试计算嵌套子列表的值的总和,我要查询的 VM 正在使用 KO 映射器进行映射,然后使用我的计算字段进行扩展。它似乎找不到我正在寻找的嵌套数组:

var HouseholdViewModel = function(data) {
    this.$type = 'HouseholdViewModel';
    ko.mapping.fromJS(data, mapping, this);

    this.T12 = ko.computed(function () {
        var total = 0;
        ko.utils.arrayForEach(this.Accounts(), function (account) {
            total += account.T12Revenue();
        });
        return total;
    }, this);

};

var AccountViewModel = function(data) {
    this.$type = 'AccountViewModel';
    ko.mapping.fromJS(data, mapping, this);
};

var mapping = {
    'Households': {
        create: function(options) {
            return new HouseholdViewModel(options.data);
        }
    },
    'Accounts': {
        create: function(options) {
            return new AccountViewModel(options.data);
        }
    }
};

我收到错误消息“Uncaught TypeError: Object [object Object] has no method 'Accounts'”。我假设这是由于 KO.Mapper 尚未绑定 Accounts 但映射调用高于计算的 observable。任何帮助将不胜感激。

4

1 回答 1

1

一个简单的解决方法是在您尝试在计算中使用它之前确保您有帐户。当 Accounts 存在时,这将通知您计算重新计算 -

var HouseholdViewModel = function(data) {
    this.$type = 'HouseholdViewModel';
    ko.mapping.fromJS(data, mapping, this);

    this.T12 = ko.computed(function () {
        var total = 0;
        if (!this.Accounts) { return 0; }
        ko.utils.arrayForEach(this.Accounts(), function (account) {
            total += account.T12Revenue();
        });
        return total;
    }, this);
};

如果 this.Accounts 不存在,则在其中添加 if 语句以不返回任何内容(或您想要的任何内容)。

于 2013-08-12T14:00:06.793 回答