У меня была похожая проблема с плагином ListPaging в SenchaTouch 2, и мне удалось разобраться в поведении сообщения «загрузить больше», когда достигнут конец набора данных.
Это основано на том, что придумал Джон Гордон (в отношении задания параметров конфигурации pageSize
и clearOnPageLoad
), поскольку эти свойства в Senchatouch, похоже, одинаковы. Я не смотрел на SenchaTouch1.x в деталях.В SenchaTouch 2 все параметры конфигурации должны быть определены в свойстве config
:
Ext.define('MessagingApp.store.MessageThreads', {
extend : 'Ext.data.Store',
requires: ['MessagingApp.model.MessageThread'],
config:
{
model: 'MessagingApp.model.MessageThread',
autoLoad: false,
clearOnPageLoad: false, // This is true by default
pageSize: 10, // This needs to be set for paging
proxy: {
type: 'jsonp',
pageParam: 'currentPage',
limitParam: 'pageSize',
url: APIURL + '/message-app-service/GetMessageThreads',
reader: {
type: 'json',
rootProperty: 'Data'
}
}
}
});
В представлении, где мы указываем плагины, мы можем переопределить «загрузить больше» и «больше нет записей»messages:
{
xtype:'dataview',
store:'MessageThreads',
id:'threadList',
itemTpl:Ext.create('Ext.XTemplate',
'<!-- template markup goes here -->',
{
//custom helper functions here
}
),
plugins:[
{
xclass:'Ext.plugin.ListPaging',
autoPaging: true,
// These override the text; use CSS for styling
loadMoreText: 'Loading...',
noMoreRecordsText: 'All messages loaded'
}
]
}
Проблема заключается в том, что, хотя наш веб-сервис возвращает массив записей для конкретной страницы, отсутствует общее свойство общего количества, которое требуется плагину, чтобы определить, когда все записи былизагружен.Следовательно, сообщение «Загрузить еще» останется (проблема № 1 в принятом решении).Таким образом, в функции init
нашего контроллера мы должны прикрепить обработчик событий для события load
в хранилище, чтобы подключить его при получении новой страницы данных:
Ext.define('MessagingApp.controller.Messages',
{
extend: 'Ext.app.Controller',
config:
{
views: [
'MessageThreads',
// Other views referenced by this controller
],
stores: [
'MessageThreads'
],
refs:
{
// References to UI elements by selector...
}
},
init: function() {
// Other internal initialisation...
this.control(
{
// Selector-object pairs...
});
// Provide a means to intercept loads of each page of records
var threadStore = Ext.getStore('MessageThreads');
threadStore.addBeforeListener('load', this.checkForThreadListEnd, this);
},
// Remaining controller functions...
});
Вобработчик, мы понимаем, что достигли конца набора данных, когда количество возвращаемых записей меньше размера страницы.Если общее количество записей кратно размеру страницы, последняя «страница» будет иметь пустой массив.После определения конца набора данных мы обновляем свойство конфигурации totalCount
хранилища:
checkForThreadListEnd: function(store, records, isSuccessful) {
var pageSize = store.getPageSize();
var pageIndex = store.currentPage - 1; // Page numbers start at 1
if(isSuccessful && records.length < pageSize)
{
//Set count to disable 'loading' message
var totalRecords = pageIndex * pageSize + records.length;
store.setTotalCount(totalRecords);
}
else
store.setTotalCount(null);
},
// Other controller functions...
Поскольку это обработчик события 'before', это свойство будет критически обновлено до того, какПлагин решает, отображать ли сообщения «загрузить больше» или «больше нет записей».К сожалению, фреймворк не позволяет скрыть сообщение «больше никаких записей», так что это должно быть сделано с помощью CSS.
Надеюсь, это поможет.