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 期望能够在相关模型属性中给出的路径上找到全局范围内相关模型的构造函数。

问题是它没有找到 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 回答