Backbone.js - Коллекция в экземпляре анонимного представления, запрашивающая более одного раза при получении - PullRequest
1 голос
/ 08 сентября 2011

Я использую Маршрутизатор для создания экземпляров моих представлений анонимно, чтобы я мог просто отобразить их при инициализации.

window.Router = Backbone.Router.extend({
  routes: {
    '': 'index',
    ...
  },

  index: function() {
    new SchoolsView();
  },

  ...

});
window.SchoolsView = Backbone.View.extend({        
    events: {
        'click .more a': 'loadMore'
    },

    initialize: function() {    
        this.collection = new schoolList();

        this.collection.bind('add', this.add, this);
        this.collection.bind('reset', this.render, this);

        this.collection.fetch();
    },

    render: function() {
      ...
    },

    add: function(school) {
      ...
    },

    loadMore: function() {
      this.collection.loadMore();
      return false;
    }
});

Коллекция представления, которая создается внутри конструктора представления, имеет вычисленное свойство url, которое поддерживает параметр «смещения» разбиения на страницы для каждого запроса. Перед каждым запросом «следующая страница» параметр «смещение» увеличивается на единицу, чтобы сервер возвращал следующее смещение результатов. Первый collection#fetch() использует значение «смещения» по умолчанию из метода инициализации, оно увеличивается после вызова метода collection#loadMore().

window.schoolList = Backbone.Collection.extend({
  initialize: function() {
    this.offset = 1;
  },

  url: function() {
    return this.baseUrl()+'?offset='+this.offset;
  },

  pageInfo: function() {
    var info = {
      total: this.total,
      offset: this.offset,
      pages: Math.ceil(this.total / 9),
      more: false
    };

    if (this.offset < info.pages) info.more = this.offset + 1;

    return info;
  },

  loadMore: function() {
    if (!this.pageInfo().more) return false;
    this.offset += 1;
    return this.fetch({ add: true });
  }
});

Это работало замечательно, пока я не заметил, после нескольких перемещений назад и вперед от маршрута по умолчанию, который реализует рассматриваемый вид и коллекцию, к другому; и щелкнув элемент, который вызывает метод collection#loadMore() коллекции, fetch() был вызван столько раз, сколько я перешел обратно к маршрутизатору по умолчанию.

Я ожидал, что он вызовет fetch() только один раз, но он легко вызывает метод 2 или более раз после навигации. Это потому, что экземпляр не был уничтожен после того, как я сменил маршруты и вернулся обратно? Если да, то как правильно очистить объект после того, как он мне больше не нужен?

1 Ответ

0 голосов
/ 08 сентября 2011
window.Router = Backbone.Router.extend({
    routes: {
        '': 'index',
        ...
    },

    index: function() {
    var collection = new schoolList(),
        view = new SchoolsView({
            collection: collection
        });

    this
        .trigger('destroy_index')
        .bind('destroy_index', function() {
            collection.reset();
            view.remove();
        });
    },

    ...

});

window.SchoolsView = Backbone.View.extend({ 
    initialize: function() {    
        this.collection.bind('add', this.add, this);
        this.collection.bind('reset', this.render, this);

        this.collection.fetch();
    },
    ...
});
...