Я столкнулся с этой проблемой отсюда:
RequireJS + BackboneRelational + Self-Referential . Кажется, он унаследовал некоторые из своих проблем из этой ветки, поэтому я подумал, что могу добавить свою копейку.
Во-первых, поскольку вы используете RequireJS, глобальных переменных не существует. Вы не можете просто указать имя объекта, вам нужно указать фактические ссылки на объекты для relatedModel
и collectionType
.
Ваша самая хитрая проблема заключается в том, что ModuleModel
relatedModel
на самом деле ModuleModel
само по себе, что не будет определено, когда вы назначите его relatedModel
(используя модель AMD). Вы должны отложить назначение до тех пор, пока не будет назначено ModuleModel
.
Наконец, вам нужно разрешить циклическую ссылку. Доккаэби находится на правильном пути, когда он предлагает использовать exports
, но его реализация на самом деле неправильно использует exports
. При экспорте прикрепите объект непосредственно к exports
, как он предлагает, но когда вы импортируете его, вам нужно обратиться к модулю, чтобы использовать его, а не exports
.
Это должно работать:
ModuleModel.js
define(['exports', 'ModuleCollection'], function (exports, Module) {
'use strict';
var ModuleModel = Backbone.RelationalModel.extend({
urlRoot: 'api/module',
_radius: 50,
relations: [{
type: Backbone.HasMany,
key: 'children',
// ModuleModel is undefined; this line is useless
// relatedModel: ModuleModel,
// no globals in require; must use imported obj ref
collectionType: Module.Collection,
reverseRelation: {
key: 'parent_id',
includeInJSON: 'id'
}
}],
url: function() {
return this.id? 'api/module/' + this.id : 'api/module';
}
});
// Now that `ModuleModel` is defined, we can supply a valid object reference:
ModuleModel.prototype.relations[0].relatedModel = ModuleModel;
// Attach `Model` to `exports` so an obj ref can be obtained elsewhere
exports.Model = ModuleModel;
});
ModuleCollection.js
define(['exports', 'ModuleModel'], function(exports, Module) {
'use strict';
var ModuleCollection = Backbone.Collection.extend({
// must reference the imported Model
model: Module.Model,
url: 'data.php' // <-- or wherever
});
// Attach `Collection` to `exports` so an obj ref can be obtained elsewhere
exports.Collection = ModuleCollection;
});
Main.js
define(['ModuleCollection'], function(Module) {
'use strict';
var modules = new Module.Collection();
modules.fetch().done(function() {
modules.each(function(model) {
console.log(model);
});
});
});