【问题标题】:Computed observables in nested arrays with mapping plugin使用映射插件计算嵌套数组中的 observables
【发布时间】:2013-08-05 12:55:36
【问题描述】:

我有一个包含许多问题的表格。每个问题都有多个答案。在表单级别,我想创建一些计算的可观察数据,例如总分和问题数量。 formmodel、questionsmodel 和 answermodel 的创建方式相同。 问题模型“知道”答案。它让我可以创建计算出的 observables,例如答案的数量或最大点数。

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

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

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

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

    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().length 之前使用 console.log(self) ,那么这不是您想要的,或者至少现在还不是。

    Map JSON data to Knockout observableArray with specific view model type

    【讨论】:

    • 感谢您的建议。但是它并没有解决我的问题:检查 self.questions() 仍然给出相同的错误“questions() 不是函数”。将函数“formViewModel(data){”更改为“var formViewModel = function(data){”没有做任何事情。我在一次 Ajax 调用中获取所有数据。因此 formViewModel 使用 ko.mapping.fromJSON。 questionsModel 使用的是 ko.mappingfromJS。好像这些功能是不等价的……
    • 你是对的!!这是一个范围问题。我应该是: return self.formulier.questions().length; (“formulier”是我的 JSON 字符串的第一个或根元素的名称)Wonderfull。非常感谢!
    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2019-08-13
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多