我需要在Backbone中构建几个只有URL不同的集合。这是我的模特:
App.Models.Main = Backbone.Model.extend({});
这是我的收藏:
App.Collections.Mains = Backbone.Collection.extend({
model: App.Models.Main,
initialize: function() {
this.fetch({
success: function(data) {
//console.log(data.models);
}
});
},
url: this.url
});
在我的路由器中,我尝试过:
mc = new App.Collections.Mains({ url: 'main-contact'});
mains = new App.Views.Mains({ collection: mc});
$('#web-leads').append(mains.el);
但是我收到了这个错误:Error: A "url" property or function must be specified
如何将URL传递到集合中?
答案 0 :(得分:2)
Backbone.Collection
构造函数如下所示:
Backbone.Collection = function(models, options) { ...
它希望将选项作为第二个参数。第一个参数是用于初始化集合的模型列表。
您需要使用以下内容初始化集合:
mc = new App.Collections.Mains(null, { url: 'main-contact'})
此外,当您定义收藏时,您没有正确设置url
属性。定义模型时会计算表达式this.url
,而不是在初始化模型时。 this
的上下文不指向集合的任何实例,而是指定模型时的范围,可能是window
。 Javascript允许您尝试将其设置为window.url
,但由于window
没有此类属性,因此将其设置为undefined
。
而不是:
App.Collections.Mains = Backbone.Collection.extend({
url: this.url
});
您需要在initialize
方法中设置网址:
App.Collections.Mains = Backbone.Collection.extend({
initialize: function(models, options) {
if(options && options.url) {
this.url = options.url;
}
}
});
答案 1 :(得分:0)
这应该有用,但有点难看:
mc = new (App.Collections.Mains.extend({ url: 'main-contact'}));
mains = new App.Views.Mains({ collection: mc});
你基本上扩展你的基础集合并在其上调用新的。解开它会是这样的:
MainContantCollection = App.Collections.Mains.extend({ url: 'main-contact'});
mc = new MainContactCollection();
mains = new App.Views.Mains({ collection: mc});