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:

Sogl 07.10.2016 07:58

Пока что такое решение:
//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);
//reload store
store.reload();


Соответственно, это еще +1 запрос после удаления на получение списка снова, что не очень радует.

Pavel M. 07.10.2016 12:46

Цитата:

Сообщение от Sogl
Простой onLoad() ничего не делает.

почему не делает
обновляет toolbar
простенький пример https://fiddle.sencha.com/#fiddle/1i3e
нажми кнопку Удалить первую строку - обновится
только данные в примере из статического json берутся, поэтому сами данные, которые через ajax запрашиваются, не обновляется

Sogl 08.10.2016 15:35

Хм... а у меня в 6.0.1 почему-то всегда выпадает значение в getTotalCount() ДО удаления. Лишь в count() реальное значение, но там только видимые данные, в пагинации.

Sogl 13.10.2016 04:05

В общем, ребят, так я и не пойму как store объявлять без ViewModel.:help:

Лезем в доку и видим, что можно передавать storeId что в грид, что в тулбар:
http://docs.sencha.com/extjs/6.2.0/c...html#cfg-store
http://docs.sencha.com/extjs/6.2.0/c...html#cfg-store

Ок. Прописываем у store следующее:
storeId: 'employees1',


Пишем `store: 'employees1'` в тулбаре и гриде и получаем ошибку:
TypeError: store is undefined


Хорошо, ищем примеры объявления. Например, в примере грида сразу есть такое:
store: Ext.data.StoreManager.lookup('employees1'),

Прописываем в грид и тулбар и в итоге наши записи не грузятся в таблицу:blink:

То же самое для этого кода:
store: Ext.getStore('employees1')


Зато если прописать вот так:
//грид
store:  Ext.create('MyApp.store.employees.Employees'),
//тулбар
store: Ext.getStore('employees1')


то все работает, НО.... теперь даже если захожу во view логина, то у меня ИДЕТ GET ЗАПРОС на получение сотрудников из главного view, который еще даже не загружен. Я так понимаю, это связано с requires секцией, но в view логина я не гружу этот store.

В общем, это какое-то сильное колдунство...со stores во ViewModel все работает адекватно и грузится именно тогда, когда вызвана вьюшка.

Sogl 13.10.2016 04:47

Кстати, про этот фидл:
https://fiddle.sencha.com/#fiddle/1i3e

Такой код:
store.totalCount = store.getTotalCount() - 1;
pb.onLoad();


Разве учитывает то, что мы удалим не один элемент, а, например, 5... или когда несколько пользователей работают с таблицей и удаляют одновременно разные записи?
Похоже, релоад store лучший вариант.

Sogl 13.10.2016 07:31

В общем, посмотрел я вот этот пример:
http://examples.sencha.com/extjs/6.2...k/#paging-grid

и увидел, что в `pagingtoolbar` вообще можно store не прописывать и все замечательно работает. Убедился, что это так.
Хватает такого кода в гриде:
store: {
        type: 'employees'
    },

Чудеса)
В одном примере Сенча прописывает, в другом нет...

Pavel M. 13.10.2016 11:28

В документации к 6.2 классик версии
http://docs.sencha.com/extjs/6.2.0/c...html#cfg-store
сказано
If no store is provided, the store of the owner component (if there is an owner and it has a store) is used.


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