Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Кнопка refresh не работает в pagingtoolbar без ViewModel (https://javascript.ru/forum/extjs/65152-knopka-refresh-ne-rabotaet-v-pagingtoolbar-bez-viewmodel.html)

Sogl 30.09.2016 09:52

Кнопка refresh не работает в pagingtoolbar без ViewModel
 
Всем привет!

Обнаружил сегодня такую интересную багу(?) при выводе таблицы. Если я не указываю ViewModel и просто прописываю store вот так для грида и pagingtoolbar:
store: {
    type: 'employees'
}

То данные в таблицу отлично загружаются, но кнопка refresh в тулбаре не обновляет ничего.

Но если создать ViewModel вот такой:
Ext.define('MyApp.view.employees.EmployeesModel', {
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.employees',

    requires: [
        'Ext.data.Store',
        'Ext.data.proxy.Memory',
        'Ext.data.field.Integer',
        'Ext.data.field.String',
        'Ext.data.field.Date',
        'Ext.data.field.Boolean',
        'Ext.data.reader.Json'
    ],

    stores: {
        usersResults: {
            type: 'employees'
        },
    }
});


А потом прописать его во вьюхе:
viewModel: {
        type: 'employees'
},


И прописать store через bind в гриде и тулбаре:
bind: '{usersResults}'


То кнопка refresh отлично работает!

С чем связано подобное поведение? :-?

Pavel M. 30.09.2016 11:51

так в документации, например, в версии 5.1.3

для грида http://docs.sencha.com/extjs/5.1.3/a...html#cfg-store
параметр store может содержать Store config object, например { type: 'employees' }

а смотрим на pagingtoolbar
http://docs.sencha.com/extjs/5.1.3/a...html#cfg-store
параметр store только либо Ext.data.Store class / subclass либо String - ID of a store

так что, похоже, ваше поведение pagingtoolbar согласно документации :-)

nohuhu 30.09.2016 21:32

Это потому, что конфиг с типом хранилища приводит к созданию отдельного экземпляра, и получается, что у grid одно хранилище, а у Paging toolbar другое. Как два гуся из песенки. :)

Sogl 03.10.2016 01:39

Цитата:

Сообщение от nohuhu (Сообщение 430397)
Это потому, что конфиг с типом хранилища приводит к созданию отдельного экземпляра, и получается, что у grid одно хранилище, а у Paging toolbar другое. Как два гуся из песенки. :)

Вон оно как... а я такой еще смотрю количество показывает, а кнопка не работает. :blink:

Так каким образом прописывать store здесь? Через storeID?
ViewModel мне тут в принципе не особо нужна...

Pavel M. 03.10.2016 11:35

например в initComponent
создай укажи store для Paging toolbar, как здесь делают http://examples.sencha.com/extjs/5.1...k/#paging-grid

Sogl 06.10.2016 10:09

Удаляю строку в гриде через actioncolumn вот так:
{
    xtype: 'button',
    iconCls: 'x-fa fa-close',
    handler: function(grid, rowIndex, colIndex) {
        //get store
        var store = grid.getStore();
        //get current record by row index
        var rec = store.getAt(rowIndex);
        //delete (autosync do all job)
        store.remove(rec);
    }
}


Но итоговое количество в pagingtoolbar остается прежним. Какое-то событие надо вызывать его обновления?

kolka 06.10.2016 13:22

store.sync()
store.reload()

kolka 06.10.2016 13:24

Или в свойствах store укажи
autoSync : true

Pavel M. 06.10.2016 13:52

Цитата:

Сообщение от kolka
store.reload()

зачем хранилище перезагружать?
достаточно просто
обновить информацию на pagingtoolbar
pagingToolbar.onLoad();

для надежности иногда можно
gridStore.totalCount = gridStore.count();
pagingToolbar.onLoad();

Sogl 07.10.2016 07:30

Цитата:

Сообщение от kolka (Сообщение 430842)
Или в свойствах store укажи
autoSync : true

Уже указано, в том то все и дело.

Цитата:

Сообщение от Pavel M. (Сообщение 430844)
зачем хранилище перезагружать?
достаточно просто
обновить информацию на pagingtoolbar
pagingToolbar.onLoad();

для надежности иногда можно
gridStore.totalCount = gridStore.count();
pagingToolbar.onLoad();

Не помогает этот код... я использую еще и пагинацию, поэтому у меня получается, что:
  1. У меня показано 1-25 из 35 элементов
  2. Удаляю. При этом из БД элемент удаляется (становится 34) и store.count() в консоли показывает 35, а store.totalCount уже 24
  3. Срабатывает onLoad() и тулбар показывает "1-24 из 24", что в корне неверно, т к у меня 34 на самом деле уже.

Простой onLoad() ничего не делает.
Интересно, почему такой простой момент автоматом не выполняется? :blink:


Часовой пояс GMT +3, время: 11:09.