带有映射插件的嵌套数组中的计算可观察量

时间:2013-08-04 21:15:22

标签: knockout.js knockout-mapping-plugin

我有一个带有大量问题的表格。每个问题都有很多答案。在表单级别,我想创建一些计算的可观察量,如总分和问题数。 formmodel,questionsmodel和answermodel以相同的方式创建。 问题模型是“意识到”答案。它允许我创建计算的可观察量,如答案数或最大点数。

我的问题是表单模型无法识别问题数组。我可以在每个问题中计算答案的数量,但不能计算表格中的问题数量。我的模型有问题或我应该调查我的数据吗?

function formViewModel(data) {
        var self = this;
        var mapping = {
            'questions': {
                create: function (options) {
                    return new questionsViewModel(options.data);
                }
            }
        };        
        var model = ko.mapping.fromJSON(data, mapping, self);
        model.numberOfQuestions = ko.computed(function () {
            return self.questions().length; // error: self.questions() is not a function
        });
        return model;
    }

    function questionsViewModel(data) {
        var self = this;
        var mapping = {
            'answers': {
                create: function (options) {
                    return new answersViewModel(options.data);
                }
            }
        };
        var model = ko.mapping.fromJS(data, mapping, self);
        model.numberOfAnswers = ko.computed(function () {
            return self.answers().length; // no problem
        });
        return model;
    }

    function answersViewModel(data) {
        var self = this;
        var mapping = {};
        var model = ko.mapping.fromJS(data, mapping, self);
        return model;
    }

1 个答案:

答案 0 :(得分:0)

我认为您在完全实例化之前尝试获取问题的长度 - 您是否可以尝试将计算结果更改为以下内容 -

model.numberOfQuestions = ko.computed(function () {
    if (!self.questions()) {return 0;}
    return self.questions().length; // error: self.questions() is not a function
});

但看起来您可能会遇到一些范围问题 -

function formViewModel(data) {
    var self = this;
    self.mapping = {
         // do stuff
    };
}

有关在嵌套地图中正确建立范围的详细信息,请查看此答案。我敢打赌如果你在你的self.questions()之前调试.log(自我)。长度它不是你想要的,或者它至少不是。

Map JSON data to Knockout observableArray with specific view model type