Ext js Обновление общего количества панелей инструментов на лету - PullRequest
11 голосов
/ 06 февраля 2011

Это должно быть довольно просто, но я еще не нашел способ сделать это.

Я использую ExtJs v.3.3.

У меня есть панель сетки, которая позволяет записыватьудаление с помощью контекстного меню.

Сетка имеет панель инструментов подкачки, которая прикреплена к хранилищу панелей.

Процесс удаления отправляет на сервер запрос ajax, в случае успеха я удаляю запись изstore (используя метод remove).

Дело в том, что панель инструментов подкачки не отражает изменения в хранилище, то есть общее количество записей не изменяется до тех пор, пока хранилище не будет перезагружено.

Есть ли способ установить общее количество записей на панели инструментов подкачки?

Спасибо

Ответы [ 8 ]

10 голосов
/ 29 июня 2013

Это работает как брелок для ExtJs версии 4.1.3.

gridStore.add(record);                    //Add the record to the store    
gridStore.totalCount = gridStore.count(); //update the totalCount property of Store
pagingToolbar.onLoad();                   //Refresh the display message on paging tool bar
5 голосов
/ 06 февраля 2011

Не можете ли вы вернуть значение totalProperty в ответе после удаления данных в БД?

РЕДАКТИРОВАТЬ:

Вам потребуетсясначала правильно составьте свой ответ.Вот как это должно выглядеть в соответствии с API Docs для панели инструментов подкачки.

При использовании конфигурации автозагрузки магазина:

  var myStore = new Ext.data.Store({
    reader: new Ext.data.JsonReader({
        totalProperty: 'results', 
        ...
    }),
    ...
    });
    var myStore = new Ext.data.Store({
    autoLoad: {params:{start: 0, limit: 25}},
    ...
    });

Пакет отправляется обратно с серверабудет иметь такую ​​форму:

{
"success": true,
"results": 2000, 
"rows": [ // *Note: this must be an Array 
    { "id":  1, "name": "Bill", "occupation": "Gardener" },
    { "id":  2, "name":  "Ben", "occupation": "Horticulturalist" },
    ...
    { "id": 25, "name":  "Sue", "occupation": "Botanist" }
]
}
4 голосов
/ 17 ноября 2011

Для меня это работало нормально:

me.gridStore.add(data);

// Manually update the paging toolbar.
me.gridStore.totalCount = 500;
me.pagingToolbar.onLoad();
2 голосов
/ 13 августа 2012

У меня была похожая проблема при получении результатов от стороннего API, у которого был отдельный URL для количества элементов. Я создал новый класс, унаследованный от pagingtoolbar с дополнительной функцией updatePager ():

updatePager : function(){
    var me = this,
        pageData,
        currPage,
        pageCount,
        afterText,
        count,
        isEmpty;

    count = me.store.getCount();
    isEmpty = count === 0;
    if (!isEmpty) {
        pageData = me.getPageData();
        currPage = pageData.currentPage;
        pageCount = pageData.pageCount;
        afterText = Ext.String.format(me.afterPageText, isNaN(pageCount) ? 1 : pageCount);
    } else {
        currPage = 0;
        pageCount = 0;
        afterText = Ext.String.format(me.afterPageText, 0);
    }

    Ext.suspendLayouts();
    me.child('#afterTextItem').setText(afterText);
    me.child('#inputItem').setDisabled(isEmpty).setValue(currPage);
    me.child('#first').setDisabled(currPage === 1 || isEmpty);
    me.child('#prev').setDisabled(currPage === 1  || isEmpty);
    me.child('#next').setDisabled(currPage === pageCount  || isEmpty);
    me.child('#last').setDisabled(currPage === pageCount  || isEmpty);
    me.child('#refresh').enable();
    me.updateInfo();
    Ext.resumeLayouts(true);

    if (me.rendered) {
        me.fireEvent('change', me, pageData);
    }
}

});

Я добавил itemId к нему при добавлении в док

    dockedItems: [{
            xtype: 'dynamicpagingtoolbar',
            itemId: 'pager_id',
            dock: 'bottom',
            store: 'CompoundPharmacologyPaginatedStore',
            displayInfo: true
        }],

Я добавил функцию setTotalCount () в связанный магазин:

setTotalCount: function(count) {
    this.totalCount = count;
}

Затем, когда вы хотите обновить его, вызовите store.setTotalCount (total), а затем pager.updatePager (). Помните, что сначала вам нужно получить пейджер, используя что-то вроде

pager = grid_view.down ('# pager_id');

0 голосов
/ 20 декабря 2017

Если у вас есть несколько страниц на панели инструментов подкачки и вы выполняете операцию вставки / удаления локально из хранилища, используйте приведенный ниже фрагмент.

updatePagingToolbar: function (pagingToolbar) {
    var store = pagingToolbar.getStore()
    , affectedChanges = store.getCount() - store.config.pageSize;

    if (pagingToolbar.store.totalCount > store.config.pageSize)
        pagingToolbar.store.totalCount += affectedChanges;
    else
        pagingToolbar.store.totalCount = store.getCount();
    pagingToolbar.onLoad();
}
0 голосов
/ 04 апреля 2011

У меня была похожая ситуация при попытке использовать несколько панелей инструментов подкачки (верх / низ сетки). Единственное место на панели инструментов подкачки, которое обновляет дисплей, вызывается при загрузке магазина. Таким образом, вы можете запустить событие вручную (но остерегайтесь непредвиденных последствий!). В моем случае это работало хорошо при запуске из слушателя beforechange одной из моих панелей инструментов:

myStore.fireEvent('load', myStore, myStore.data.items, myStore.lastOptions);

Или ... вы можете переопределить или расширить PagingToolbar, чтобы добавить открытый метод, который будет вызывать или переопределять функцию onLoad

0 голосов
/ 07 февраля 2011

store.totalLength = store.totalLength - 1;

это изменит количество строк в хранилище, но я не уверен, будет ли это изменение отражено панелью инструментов подкачки.

0 голосов
/ 07 февраля 2011

«Процесс удаления отправляет на сервер запрос ajax, в случае успеха я удаляю запись из хранилища (используя метод удаления) ...» - это говорит о том, что у вас есть метод, который обрабатывает действие «удалить» - и есливы используете Ext.PagingToolbar - просто добавьте еще одну строку, например:

(this).YourPagingToolbar.doRefresh()

Я поместил (this) в (), потому что вы не предоставили пример кода, поэтому я не уверенВы определили это

...