0

我正在尝试创建一些通用模块,以便可以在多个 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/快速样机

[编辑] 似乎问题出在“解析”函数中?

4

1 回答 1

1

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

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

http://jsfiddle.net/Bb5sq/12

于 2013-06-22T06:30:48.817 回答