Проблемы со ссылками и магазинами в Sencha ExtJS - PullRequest
0 голосов
/ 14 января 2020

Я новичок здесь, в Stackoverflow и в разработке Sencha Ext JS. Я студент из Германии, и в настоящее время я пытаюсь получить степень в области компьютерных наук. Как часть моего последнего задания я в настоящее время разрабатываю пользовательский интерфейс веб-приложения для местной компании. Когда я опробовал возможности фреймворка Sencha Ext JS, я столкнулся с некоторыми проблемами, поэтому сейчас я обращаюсь к сообществу за помощью;) Моя первая проблема, с которой я столкнулся, была, когда я играл с синтаксис для создания экземпляров классов с использованием xtypes и ассоциация Stores внутри ViewModel:

В целях упрощения чтения и менее загроможденного кода я хотел дать своим магазинам свой собственный тип xtype, чтобы я мог вместо объявления всех Хранилища и их конфиги в конфигурации хранилищ ViewModels хотели, чтобы каждое хранилище находилось в их собственном файле, а затем просто создавало их экземпляр позже во ViewModel. Код, который я написал для этого, выглядит следующим образом: ViewModel:

Ext.define('Example.viewmodel.MyViewModel', {
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.myviewmodel',

    requires: [
        'Example.store.MyStore',
    ],


    stores: {
        StoreA:        { xtype: 'store_a'        },
        StoreB:        { xtype: 'store_b'        },
        StoreC:        { xtype: 'store_c'        }
    },

    data: {
        /* This object holds the arbitrary data that populates the                      ViewModel and 
        is then available for binding. */
    }
});

StoreA:

Ext.define('Example.store.StoreA', {
    extend: 'Ext.data.Store',
    xtype: 'store_a',

    requires: [
    'Example.model.ModelA'
],

    storeId: 'StoreA',
    autoLoad: false,
    model: 'Example.model.ModelA',
    listeners: {
    load: 'onLoadofStoreA'
}
});

Но, видимо, это не работает… Мой загрузочный приемник магазина, похоже, не выстрелить по методу внутри моего контроллера и, похоже, даже не знает о представлении, связанном с ViewModel. Что я делаю не так или это просто не так? Моя вторая проблема была, когда я играл с некоторыми компонентами пользовательского интерфейса. Мой сценарий был такой: я хотел, чтобы у меня было меню, в которое можно было бы скользить, где вы могли бы сделать некоторые входные данные, которые бы затем загружали контент для представления. Я нашел этот пример для скользящего меню (https://examples.sencha.com/extjs/6.7.0/examples/kitchensink/?modern#menus) и построил это: Внутри моего ViewController:

getMenuCfg: function (side) {
    var cfg = {
        side: side,
        controller: example_controller',
        id: 'topMenu',
        items: [
            {
                xtype: 'container',
                layout: 'hbox',
                width: '100%',
                items: [
                    {
                        xtype: 'fieldset',
                        reference: 'fldSet',
                        id: 'fldSet',
                        layout: 'vbox',
                        width: '50%',
                        defaults: {
                            labelTextAlign: 'left'
                        },
                        items: [
                        {
                            autoSelect: false,
                            xtype: 'selectfield',
                            label: 'Selectfield',
                            reference: 'sfExample',
                            id: 'sfExample',
                            listeners: {
                                change: 'onSFChange'
                            }
                        },
                        {
                            xtype: 'container',
                            layout: {
                                type: 'hbox',
                                align: 'end',
                                pack: 'center'
                            },
                            items: [{
                                xtype: 'textfield',
                                reference: 'ressource',
                                id: 'ressource',
                                flex: 1,
                                textAlign: 'left',
                                margin: '0 10 0 0',
                                label: 'Ressource',
                                labelAlign: 'top',
                                labelTextAlign: 'left',
                                editable: false,
                                readOnly: true
                            },
                                {
                                    xtype: 'button',
                                    shadow: 'true',
                                    ui: 'action round',
                                    height: '50%',
                                    iconCls: 'x-fa fa-arrow-right',
                                    handler: 'openDialog'
                                }
                            ]
                        },

                        {
                            xtype: 'textfield',
                            reference: 'tfExample',
                            id: 'tfExample',
                            label: 'Textfield',
                            editable: false,
                            readOnly: true
                        }
                        ]

                    },
    }]
}];

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я больше не буду возможность легко получить ссылки на компоненты внутри меню (поля ввода) с помощью this.lookupReference(), как если бы они были только частью представления. Фактически, чтобы найти обходной путь, мне пришлось проследить путь назад к компонентам, используя отладчик. Например, если другой метод внутри моего контроллера хотел использовать поле внутри этого меню, вместо того, чтобы просто делать this.lookupReference(‘sfExample’), я теперь должен был сделать что-то вроде этого:

var me = this,
    vm = me.getViewModel(),
    menuItems = me.topMenu.getActiveItem().getItems(),
    fieldset = menuItems.getByKey('fldSet'),
    selectfieldRessArt = fieldsetLeft.getItems().getByKey('sfExample');

Я почти уверен, что я Я упускаю что-то важное здесь, и должен быть способ сделать это проще. Очень жду ваших ответов, заранее благодарю;)

1 Ответ

1 голос
/ 14 января 2020

использовать xtype только для компонентов. если вам нужно определить тип / псевдоним для хранилища, используйте вместо этого свойство конфигурации alias и укажите категорию псевдонима "store.".

Определение хранилища с псевдонимом

Ext.define('Example.store.StoreA', {
    extend: 'Ext.data.Store',
    //use store. to category as a store
    alias: 'store.store_a',

    requires: [
    'Example.model.ModelA'
],
    storeId: 'StoreA',
    autoLoad: false,
    model: 'Example.model.ModelA',
    listeners: {
    load: 'onLoadofStoreA'
}
});

Создание экземпляра вашего магазина по типу

Ext.define('Example.viewmodel.MyViewModel', {
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.myviewmodel',

requires: [
    'Example.store.MyStore',
],


stores: {
    StoreA:        { type: 'store_a'        },
    StoreB:        { type: 'store_b'        },
    StoreC:        { type: 'store_c'        }
},

data: {
    /* This object holds the arbitrary data that populates the                      ViewModel and 
    is then available for binding. */
}

});

Надеюсь, это поможет вам

...