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

ネストされたマップでスコープを適切に確立する方法の詳細については、この回答を確認してください。self.questions().length の前に console.log(self) を実行した場合、それはあなたが探しているものではないか、少なくともまだそうではありません。

特定のビュー モデル タイプを使用して、JSON データを Knockout observableArray にマップする

于 2013-08-04T21:21:02.060 に答える