2

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

4

2 回答 2

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方法中设置url:

App.Collections.Mains = Backbone.Collection.extend({
    initialize: function(models, options) {
       if(options && options.url) {
           this.url = options.url;
       }   
    }
});
于 2013-01-08T16:55:45.990 回答
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});
于 2013-01-08T17:01:11.293 回答