sencha list paging plugin

前端 未结 5 1647
渐次进展
渐次进展 2021-02-10 06:38

I\'m trying to use sencha touch\'s listpaging plugin. But there is almost no good( or bad ) documentation about how to use it and i\'m confused.

When i activate the plu

5条回答
  •  不要未来只要你来
    2021-02-10 07:22

    I've had a similar issue with the ListPaging plugin in SenchaTouch 2, and managed to sort out the 'load more' message behaviour when the end of the data set is reached.

    This builds on what John Gordon has come up with (regarding specifying the pageSize and clearOnPageLoad config options), since these properties seem to be the same in Senchatouch 2. I haven't looked at SenchaTouch 1.x in detail. In SenchaTouch 2, all config options must be defined in a config property:

    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'
                }
            }
        }
    });
    

    In the view, where we specify the plugins, we can override the 'load more' and 'no more records' messages:

    {
        xtype:'dataview',
        store:'MessageThreads',
        id:'threadList',
        itemTpl:Ext.create('Ext.XTemplate',
            '',
            {
                //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'
            }
        ]
    }
    

    The issue is that while our web service returns an array of records for a particular page, there is no overall total count property, which is needed for the plugin to determine when all records have been loaded. Hence as it is, the 'Load more' message will remain (issue #1 in the accepted solution). So in the init function of our controller, we have to attach an event handler for the load event on the store to hook into when a new page of data is received:

    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...
    
    });
    

    In the handler, we realise that we've reached the end of the data set when the number of records returned is less than the page size. If the total record count is a multiple of the page size, the last 'page' will have an empty array. Once the end of the data set has been identified, we update the totalCount config property of the store:

    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...
    

    Because this is a 'before' event handler, this property will be crucially updated before the plugin decides whether to display the 'load more' or 'no more records' messages. Unfortunately, the framework doesn't provide a means to hide the 'no more records' message, so this would have to be done via CSS.

    Hope this helps.

提交回复
热议问题