2

ツリーをモデル化するためのBackbone-Relationalプラグインを評価しています。私は次のサンプルコードを持っています

var SurveyTreeNode = Backbone.RelationalModel.extend({
    relations: [{
        type: Backbone.HasMany,
        key: 'questions',
        relatedModel: 'SurveyTreeNode'
    }]
});


var survey = {
    id: 1,
    questions: [
        { 
            id: 2, 
            text: 'What is your name?' 
        },
        { 
            id: 3, 
            text: 'What hours do you work?', 
            questions: [
                {
                    id: 3,
                    text: 'On Monday?'
                },
                {
                    id: 4,
                    text: 'On Tuesday?'
                }
            ]                
        }
    ]
};

var questionTree = new SurveyTreeNode(survey);

これは(Google Chromeコンソールで)次のようになります。

no model, key or relatedModel (function (){ parent.apply(this, arguments); }, "questions", undefined) 

エラーが上記のように正確に表示されないため、このコードをjsfiddleにロードしました(展開可能な子要素を示しています):http: //jsfiddle.net/hoffmanc/XsDQu/

4

2 に答える 2

4

Backbone Relationalは、relatedModelプロパティで指定されたパスで、グローバルスコープ内の関連モデルのコンストラクターを見つけることができることを期待しています。

問題は、SurveyTreeNodeのコンストラクター関数が見つからないことです。

ローカル環境で上記のコードをどのように実行しているか、またはjsFiddleがコードをラップするために(おそらくいくつかのDOMReadyイベントでコードをラップする)正確に何をするかはわかりませんが、どちらの場合も、SurveyTreeNodeはグローバルスコープにありません。

varSurveyTreeNodeの前にキーワードを削除すると、グローバルスコープで使用できるようになり、後続のコードが機能します。

このjsFiddleを参照してください:http: //jsfiddle.net/edwardmsmith/qTA83/

于 2012-05-08T20:32:24.940 に答える
1

グローバル名前空間を汚染したくない場合の別の回避策:

var MenuNode = function () {
    Backbone.RelationalModel.apply(this, arguments);
};
MenuNode = Backbone.RelationalModel.extend({
    constructor: MenuNode,
    relations: [
        {
            type: Backbone.HasMany,
            key: "children",
            relatedModel: MenuNode,
            reverseRelation: {
                key: "parent"
            }
        }
    ]
});

このようなハッキングを避けるために、Backbone.selfRelated(または同様のもの)フラグを追加することを提案しました。https://github.com/PaulUithol/Backbone-relational/issues/347

于 2013-05-22T12:18:42.653 に答える