Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Ошибка при получении индекса записи combobox (https://javascript.ru/forum/extjs/75557-oshibka-pri-poluchenii-indeksa-zapisi-combobox.html)

Ambassador 19.10.2018 00:17

Ошибка при получении индекса записи combobox
 
Здравствуйте, уважаемые форумчане!
Вопрос заключается в следующем:
В Ext.window.Window я использую combobox:
Ext.define('BookApp.view.BookEdit', {
    extend: 'Ext.window.Window',
    alias: 'widget.bookwindowedit',   
    title: 'BookEdit',
    layout: 'fit',
    autoShow: true,
    store: 'BookStore',
    modal   : true,
    initComponent: function() {
        var me = this;
        me.myStates = Ext.data.StoreManager.get('States').load();     

        me.items = [{
                xtype: 'form',
                items: [               
                {
                    xtype: 'combobox',
                    fieldLabel: 'Status',
                    name: 'status',
                    store: me.myStates,
                    valueField: 'id',
                    displayField: 'name',
                    typeAhead: true,
                    queryMode: 'remote',                   
                    listeners: {
                                'select': function (combo, records) {
                                    index = records.internalId;                                   
                                    filterCombo(combo, index);
                                },
                                'render': function (combo) {
                                index = combo.getSelection().internalId;
                                //console.log(index)
                                filterCombo(combo, index);
                            }
                        }
                },            
....
function filterCombo(combobox, index) {
            store = combobox.getStore();
            store.clearFilter();
            store.filterBy(
                function(record) {
                    if ((record.data.order_install == index - 1)  || (record.data.order_install == index + 1)) {
                        return true;
                    } else {
                       return false;
                    }
                }
            );
        };

При получение индекса записи в render:
index = combo.getSelection().internalId;

получаю ошибку:
TypeError: combo.getSelection (...) is null

В combo у меня точно есть объект моего комбобокса.
Почему возникает ошибка и как тогда правильно получить индекс записи?
Заранее спасибо.

Swat2k 19.10.2018 05:41

Ну и что тут не понятного? ты отрендерил combobox но у него нет стартового значения (и как следствие selection'а). И да, не путай индекс с internalId. Индексы должны получаться методами store.indexOf(rec), store.indexOfId(id).
И вообще используйте fiddle для примеров, так вам помогут гораздо быстрее.

Infarch 19.10.2018 11:00

Вопросик не по теме: а зачем вы присваиваете items в initComponent? Не проще ли сделать это прямо в конфиге класса?

Ambassador 19.10.2018 15:15

Цитата:

Сообщение от Infarch (Сообщение 496648)
Вопросик не по теме: а зачем вы присваиваете items в initComponent? Не проще ли сделать это прямо в конфиге класса?

Делал по этому туториалу https://metanit.com/web/extjs/14.3.php
Определение items в initComponent разве это плохая практика или позже могут начаться проблемы?

siber-biber 19.10.2018 15:20

не все можно описать в виде JSON (к scope экземпляра например обратиться надо) вот в таких случаях идут в методы

siber-biber 19.10.2018 15:20

проблем не будет всё норм

Swat2k 22.10.2018 16:32

Цитата:

Сообщение от Ambassador (Сообщение 496652)
Делал по этому туториалу https://metanit.com/web/extjs/14.3.php
Определение items в initComponent разве это плохая практика или позже могут начаться проблемы?

Вообще это плохая практика

siber-biber 22.10.2018 19:05

Цитата:

Сообщение от Swat2k (Сообщение 496819)
Вообще это плохая практика

откуда сие?

Swat2k 22.10.2018 23:51

Цитата:

Сообщение от siber-biber (Сообщение 496850)
откуда сие?

Из опыта конечно же, в 4-ке это было оправданно, но 6-ке однозначно
нет, что именно вы хотите делать в initComponent ?

siber-biber 23.10.2018 05:17

"однозначно нет" - вот так вот раз и запретили использовать template метод (https://docs.sencha.com/extjs/6.5.2/...-initComponent) созданный/поддерживаемый Sencha.. и еще и назвали это "плохой практикой", а сенча то и не знает.

а вот к примеру вам код компонента. с ним все в порядке?
Ext.define('MyApp.Panel', {
    extend : 'Ext.Panel',
    
    tellSomething : function () { console.log('Something'); },

    tbar : [
        { 
            text    : 'Click me',
            handler : this.tellSomething,
            scope   : this
        }
    ]
});


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