如何使用requirejs和backbone创建多个集合实例

时间:2013-06-22 06:23:54

标签: backbone.js collections requirejs

我正在尝试创建一些通用模块,以便可以在多个Backbone.Collection上重用它,但我遇到了以下问题。

我已将https://github.com/backbone-boilerplate/backbone-boilerplate下载为我的应用程序模板,因此在/ app / modules中,我创建了以下js

  • /app/modules/collection.js(所有其他馆藏的常见内容)
  • /app/modules/users.js(从collection.js扩展的用户集合)

在/app/modules/collection.js中代码为:

define([
  "backbone"
],

function(Backbone) {

    var collection = Backbone.Collection.extend({

        pagination : { total : 0 },

        parse: function( response ) {

            if ( response.data ) {
                self.pagination.total = response.total;
                return response.data;
            } 

            return response;
        },

    });

    return collection;

});

在/app/modules/users.js中代码为:

define([
  "backbone",
  "modules/collection"
],

function(Backbone, Collection) {

    var users = Collection.extend({
        self: null,

        initialize: function( models, options ) {
            self = this;
        },

        getData: function() {
            this.fetch({
                success: function() {
                    console.log('ok');
                },
                error: function() {
                    console.log('error');
                }
            });
        }
    });

    return users;

});

在我的/app/router.js中代码是:

define([
  "app",
  "modules/users"
],

function(app, Users) {

  var Router = Backbone.Router.extend({
    routes: {
      "": "index"
    },

    index: function() {
        var usersA = new Users([], {
          url: 'http://test.test.test./users_a.html'
        });
        usersA.getData();

        var usersB = new Users([], {
            url: 'http://dev.digbil.com/users_b.html'
        });    
        usersB.getData();
     }
  });

  return Router;

});

http://test.test.test./users_a.html假设返回20条记录,因此在usersA.pagination.total中它应该包含值20

http://test.test.test./users_b.html假设返回50条记录,因此在usersA.pagination.total中它应该包含值50

我的问题是两个usersA.pagination.total都包含值50,好像第二个实例正在覆盖第一个实例?

但userA.models和userB.models都包含正确的数据记录,其中显示了我的usersA集合中的20个用户,以及我的userB集合中的50个用户。

如果我单独执行它们,如:

define([
  "app",
  "modules/users"
],

function(app, Users) {

  var Router = Backbone.Router.extend({
    routes: {
      "": "index"
    },

    index: function() {
        var usersA = new Users([], {
          url: 'http://test.test.test./users_a.html'
        });
        usersA.getData();
     }
  });

  return Router;

});

userA.pagination.total包含正确的值20

define([
  "app",
  "modules/users"
],

function(app, Users) {

  var Router = Backbone.Router.extend({
    routes: {
      "": "index"
    },

    index: function() {
        var usersB = new Users([], {
            url: 'http://dev.digbil.com/users_b.html'
        });    
        usersB.getData();
    }
  });

  return Router;

});

userB.pagination.total包含正确的值50

不确定我做错了什么?

[编辑]如何更改我的代码以使每个唯一实例具有不同的分页值?

[编辑] http://jsfiddle.net/mcchin/Bb5sq/快速模型

[编辑]似乎问题在于“解析”功能?

1 个答案:

答案 0 :(得分:1)

这是javascript对象的常见行为。在这里,您必须在每个集合中设置初始分页值pagination : { total : 0 }

扩展集合时,它不会创建副本,而是创建pagination值的引用。

http://jsfiddle.net/Bb5sq/12