0

我有一个包含许多问题的表格。每个问题都有多个答案。在表单级别,我想创建一些计算的可观察数据,例如总分和问题数量。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;
    }
4

1 回答 1

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
    };
}

查看此答案以获取有关在嵌套地图中正确建立范围的更多信息。我敢打赌,如果你 console.log(self) 在你的 self.questions().length 之前,那不是你要找的,或者至少现在还不是。

将 JSON 数据映射到具有特定视图模型类型的 Knockout observableArray

于 2013-08-04T21:21:02.060 回答