Backbone:使用Require.js不将集合传递到视图中

时间:2013-01-29 17:51:57

标签: backbone.js requirejs amd

我正在重写一个试图使用AMD方法的Backbone.js应用程序。我已经下载了AMD-ified版本的Backbone和Underscore。我查了一下,jQuery,Backbone和Underscore都被调用了。这是一个相当简单的项目,但由于某种原因,我的集合不再被传递给我的视图。我是AMD的新手。

这是我的模特:

define([
    'underscore',
    'backbone'
], function(_, Backbone) {
    var tableModel = Backbone.Model.extend({});
    return tableModel;
});

这是我的收藏:

define([
    'jquery',
    'underscore',
    'backbone',
    'models/tableModel'
],
function($, _, Backbone, tableModel) {
    var tablesCollection = Backbone.Collection.extend({
        url: this.url,  // passed into collection at runtime, so same code can process multiple sets of data
        model: tableModel,
        initialize: function(models, options) {
            if (options && options.url) {
                this.url = options.url;
            }
            this.fetch({
                success: function(data, options) {
                    if ($.isEmptyObject(data.models)) {
                        App.Collections.Tables.NoData(data);
                    }

                }
            });
        }
    });

    return tablesCollection;
});

以下是我的观点:

define([
    'jquery',
    'underscore',
    'backbone',
    'models/tableModel',
    'collections/tablesCollection',
    'views/tableView'
],
function($, _, Backbone, tableModel, tablesCollection, tableView) {
    var tv = Backbone.View.extend({
        tagName: 'div',
        initialize: function() {
            console.log(this.collection);  // returns collection and undefined 
            this.collection.on('reset', this.render, this);  // errors: this.collection is undefined
        },
        render: function() {
            return this;
        }
    });

    return tv;
});

以下是实例化视图和集合的地方:

define([
    'jquery',
    'underscore',
    'backbone',
    'models/tableModel',
    'collections/tablesCollection',
    'views/tablesView'
], function($, _, Backbone, tableModel, tablesCollection, tablesView) {
    var t = new tablesCollection(null, { url: 'main-contact'} );
    var tables = new tablesView({ collection: t, template: 'main-contact-template'});
    $('#web-leads').html(tables.render().el);

});

为什么我function (){return c.apply(this,arguments)}时会收到console.log(tablesCollection)?这就像集合没有被传入。它可能是路径问题吗?我的项目由js文件夹构成,文件夹中包含名为collectionsmodelsviews的子文件夹。如果我console.log(this),我得到: enter image description here

我的数据在那里,但这是我需要的吗?当我尝试console.log时,为什么我没有收到我的收藏?

2 个答案:

答案 0 :(得分:0)

请勿直接使用tablesCollection。使用this.collection。你已经用它初始化了视图

答案 1 :(得分:0)

你看到的是函数tablesCollection,即Backbone.Collection.extend(...)函数。

函数 tablesCollection可能会很好地传递给视图。但是,您需要实例化对象,例如new tablesCollection(null,{url:'url'})在将其记录到控制台之前,否则将显示扩展包装函数,这就是你现在看到的。