Локальное хранилище ExtJS5 MVVM

Как правильно использовать хранилище моделей представления MVVM?

Список.js:

Ext.define('some.List', {
    extend: 'Ext.tree.Panel',
    requires: [
        'some.ListModel'
    ],
    rootVisible : false,
    hideHeaders: true,
    viewModel: {
        type: 'list'
    },
    bind: {store:'{mlists}'},
    columns: [{
        xtype: 'treecolumn',
        dataIndex: 'name',
        flex: 1,
        sortable: false,
    }]
});

ListModel.js:

Ext.define('some.ListModel', {
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.list',
    requires: [
        'Ext.data.proxy.Ajax'
    ],
    stores: {
        mlists: {
            autoLoad: true,
            fields: [
                { name: 'id', type: 'int'},
                { name: 'name', type: 'string' },
                { name: 'count' },
                { name: 'group' }
            ],
            proxy: {
                type: 'ajax',
                api: {
                    read: 'php/lists/read.php'
                },
                reader: {
                    type: 'json',
                    rootProperty: 'lists'
                }
            }
        }
   }
});

я получаю ошибку:

Uncaught TypeError: undefined is not a function Panel.js?_dc=1404313037482:430
Ext.define.bindStore                            Panel.js?_dc=1404313037482:430
Ext.define.reconfigure                          Table.js?_dc=1404313037482:1417
Ext.define.setStore                             Table.js?_dc=1404313037482:1376
Ext.define.privates.onBindNotify                Bindable.js?_dc=1404313037482:681
Ext.define.privates.notify                      BaseBinding.js?_dc=1404313037482:83
Ext.define.privates.react                       Binding.js?_dc=1404313037482:206
Ext.define.notify                               Scheduler.js?_dc=1404313037482:394
Ext.define.onTick                               Scheduler.js?_dc=1404313037482:425
(anonymous function)                            Function.js?_dc=1404313037482:121

person askovpen    schedule 02.07.2014    source источник
comment
Вы использовали Sencha Cmd для создания приложения?   -  person Saki    schedule 02.07.2014
comment
@ Саки да. sencha app build   -  person askovpen    schedule 02.07.2014


Ответы (1)


Есть несколько проблем с кодом:

  1. Если он сгенерирован Sencha Cmd, то view someList должен находиться в каталоге view. Конечно, это будет работать, когда оно находится в другом месте, но должна быть веская причина не следовать рекомендованной Sencha структуре каталогов. Это не относится к делу.
  2. Сенча рекомендует начинать пространство имен с заглавной буквы, чтобы отличать его от других переменных. В данном случае должно читаться Some, а не some. Это не связано с проблемой.
  3. someList расширяет TreePanel, поэтому он должен использовать TreeStore. mlists это обычный магазин. Это может быть причиной проблемы.

Если вы хотите определить хранилище дерева в ViewModel, настройте его с параметром конфигурации type:'tree' и не забудьте также настроить параметр root, который является обязательным для хранилищ дерева.

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

person Saki    schedule 03.07.2014
comment
fiddle.sencha.com/#fiddle/7cb Uncaught TypeError: undefined is not a function - person askovpen; 03.07.2014
comment
Вы читали мой ответ? Если вы добавите type и root в хранилище mlists, ошибка исчезнет - я проверил ее в опубликованной вами скрипке. Разумеется, дерево не отображается, потому что не настроен прокси и данные не загружаются в хранилище. - person Saki; 04.07.2014