Я использую Маршрутизатор для создания экземпляров моих представлений анонимно, чтобы я мог просто отобразить их при инициализации.
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 или более раз после навигации. Это потому, что экземпляр не был уничтожен после того, как я сменил маршруты и вернулся обратно? Если да, то как правильно очистить объект после того, как он мне больше не нужен?