如何将URL传递给Backbone中的集合

时间:2013-01-08 16:49:37

标签: backbone.js

我需要在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传递到集合中?

2 个答案:

答案 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});