плагин подкачки списка сенчи - PullRequest
5 голосов
/ 06 сентября 2011

Я пытаюсь использовать плагин для списков страниц Sencha Touch.Но почти нет хорошей (или плохой) документации о том, как ее использовать, и я запутался.

Когда я активирую плагин в моем списке

this.myList = new Ext.List({
  store: this.myStore,
  plugins: [{
    ptype: 'listpaging',
    autoPaging: false
  }],
  itemTpl: '...'
});

, в конец списка добавляется текст «Загрузить еще» и изображение загрузки.

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

App.regStore('MyStore', {
 model: 'myModel',
 proxy: {
    type: 'ajax',
    url: 'http://mydomain.com/json?howmany=10&page=1',
    reader: {
        type: 'json',
        root: 'results'
    }
  }
});

App.stores.myStore = Ext.StoreMgr.get('MyStore');

Как я могу настроить свой магазин, чтобы при нажатии «Загрузить больше» магазин отображал страницу2 и добавить их в список автоматически?

Ответы [ 5 ]

4 голосов
/ 28 марта 2012

У меня была похожая проблема с плагином 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.

Надеюсь, это поможет.

2 голосов
/ 08 сентября 2011

У меня тоже проблемы с поиском хорошей документации, но я могу хотя бы ответить на ваш вопрос. Вам нужно добавить pageSize в свой магазин, clearOnPageLoad, если вы хотите не очистить то, что уже было загружено. Это мой код:

Ext.regStore('publicresources', {

model: 'PublicResource',
autoLoad:false,
remoteFilter:true,
sortOnFilter:true,
    pageSize: 15,
    clearOnPageLoad: false, 
sorters: [
    {
        property : 'distance',
        direction: 'ASC'
    }
]

});

Мои нерешенные вопросы, с которыми я сталкиваюсь:

  1. Как отключить элемент «Еще», когда больше нет записей для загрузки
  2. Как определить, что больше нет записей для загрузки, и куда поместить этот код обнаружения.
  3. Как сохранить список в том месте, где был пользователь. Каждая загрузка возвращается к 1-му пункту в списке

Удачи!

0 голосов
/ 06 января 2014

Просто чтобы добавить, что у меня сработало ..

Если ваш сервер возвращает totalCount, и вы хотите установить его, вы можете использовать totalProperty в считывателе

reader: {
            type: 'json',
            rootProperty: 'results',
            totalProperty: 'resultCount'
        }
0 голосов
/ 19 августа 2012

В отношении сообщения «загрузить больше или больше записей» -

Если вы пишете собственный прокси-сервер (пример здесь Приложение Sencha Touch MVC с PhoneGap ), вы устанавливаете общее количество записей в возвращаемой операции.

Если общее количество записей еще не известно, вы можете сделать что-то вроде ниже, где,

1) если вы возвращаете запрошенный лимит записей, установите сумму больше, чем записи, которые теперь будет хранить хранилище

2) если возвращается <запрошенный лимит записей, установите общее значение равным 1 (для принудительного «сообщения больше записей») </p>

    //return model instances in a result set
    operation.resultSet = new Ext.data.ResultSet({
        records: contacts,
        //total  : contacts.length,
        total  : contacts.length === operation._limit ? (operation._limit * operation._page +1) : 1,
        loaded : true
    });
    //announce success
    operation.setSuccessful();
    operation.setCompleted();
    //finish with callback
    if (typeof callback == "function") {
        callback.call(scope || thisProxy, operation);
    }
0 голосов
/ 25 октября 2011

Помните также, что в настоящее время это работает только на стороне сервера.

Тема форума http://www.sencha.com/forum/showthread.php?105193-Store-pageSize

...