Я реализовал механизм бесконечной прокрутки в GitHub Dashboard
проекте, который я сейчас разрабатываю. Эта функция добавлена в коммит 68d1728.
Основная идея состоит в том, чтобы иметь LoadMoreView
, который вызывает метод loadMore
на контроллере каждый раз, когда представление отображается в текущем окне просмотра. Для этого я использую подключаемый модуль jQuery inview. Он позволяет вам зарегистрироваться для inview
события, которое запускается, когда элемент указанного селектора отображается на экране и когда он исчезает.
Контроллер также имеет свойства, которые указывают, есть ли еще элементы для загрузки и есть ли в данный момент выбранные элементы. Эти свойства называются canLoadMore
и isLoading
.
LoadMoreView
в основном выглядит так:
App.LoadMoreView = Ember.View.extend({
templateName: 'loadMore',
didInsertElement: function() {
var view = this;
this.$().bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
if (isInView) Ember.tryInvoke(view.get('controller'), 'loadMore');
});
}
});
где шаблон loadMore
определяется следующим образом:
{{#if isLoading}}
fetching some more stuff <img width="10" src="img/ajax-loader.gif" >
{{else}}
{{#if canLoadMore}}
<a {{action "loadMore" target="controller" }}>click to load more items</a>
{{else}}
<i>no more items</i>
{{/if}}
{{/if}}
Контроллер, который обрабатывает выборку дополнительных элементов, реализуется следующим образом. Обратите внимание, что в методе loadMore
выполняется запрос к хранилищу, который загружает определенную страницу записей для модели.
App.EventsController = Ember.ArrayController.extend({
currentPage: 1,
canLoadMore: function() {
// can we load more entries? In this example only 10 pages are possible to fetch ...
return this.get('currentPage') < 10;
}.property('currentPage'),
loadMore: function() {
if (this.get('canLoadMore')) {
this.set('isLoading', true);
var page = this.incrementProperty('currentPage');
// findQuery triggers somehing like /events?page=6 and this
// will load more models of type App.Event into the store
this.get('store').findQuery(App.Event, { page: page });
} else {
this.set('isLoading', false);
}
}
});
Осталось только изначально установить content
контроллера на результат функции filter
, поэтому content
обновляется, когда новые модели загружаются в хранилище (что происходит из-за метода findQuery
в loadMore
контроллера). Кроме того, хэш query
добавляется при вызове filter
. Это гарантирует выполнение первоначального запроса к серверу.
App.eventsController = App.EventsController.create({
content: []
});
var events = App.store.filter(App.Event, { page: 1 }, function(data) {
// show all events; return false if a specific model - for example a specific
// type of event - shall not be included
return true;
});
person
pangratz
schedule
12.08.2012
ul
с добавленными к нему несколькимиli
элементами), но может быть задействовано что-то еще (например, кеширование и тому подобное). Я хотел бы увидеть пример этого, так как у меня сейчас нет времени, чтобы попробовать его кодировать. - person MilkyWayJoe   schedule 10.08.2012