我正在评估用于建模树的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);
产生(在谷歌Chrome控制台中):
no model, key or relatedModel (function (){ parent.apply(this, arguments); }, "questions", undefined)
我已将此代码加载到jsfiddle中,因为错误与上面没有完全相同(显示可以展开的子元素):http://jsfiddle.net/hoffmanc/XsDQu/
答案 0 :(得分:4)
Backbone Relational希望能够在relatedModel属性中给出的路径中找到全局范围内相关模型的构造函数。
问题在于它没有找到SurveyTreeNode的构造函数
我不确定你是如何在本地环境中执行上面的代码,或者确切地说jsFiddle用来包装代码(可能将它包装在某些DOMReady事件中),但在这两种情况下,SurveyTreeNode都不在全局范围内范围。
如果您在SurveyTreeNode之前删除var
关键字,它将在全局范围内可用,后续代码可以正常工作。
请参阅此jsFiddle:http://jsfiddle.net/edwardmsmith/qTA83/
答案 1 :(得分: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