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 が含まれていることです。2 番目のインスタンスが最初のインスタンスを上書きしているように見えますか?

しかし、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 に答える