Ошибка при получении индекса записи 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 у меня точно есть объект моего комбобокса. Почему возникает ошибка и как тогда правильно получить индекс записи? Заранее спасибо. |
Ну и что тут не понятного? ты отрендерил combobox но у него нет стартового значения (и как следствие selection'а). И да, не путай индекс с internalId. Индексы должны получаться методами store.indexOf(rec), store.indexOfId(id).
И вообще используйте fiddle для примеров, так вам помогут гораздо быстрее. |
Вопросик не по теме: а зачем вы присваиваете items в initComponent? Не проще ли сделать это прямо в конфиге класса?
|
Цитата:
Определение items в initComponent разве это плохая практика или позже могут начаться проблемы? |
не все можно описать в виде JSON (к scope экземпляра например обратиться надо) вот в таких случаях идут в методы
|
проблем не будет всё норм
|
Цитата:
|
Цитата:
|
Цитата:
нет, что именно вы хотите делать в initComponent ? |
"однозначно нет" - вот так вот раз и запретили использовать 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 } ] }); |
Никто не запрещает его использовать главное понимать что у него есть свои ограничения (там не стоит делать bind, или как в данном случае store.load, и вообще, там стоит указывать вещи которые не должны быть одинаковыми на уровне цепочки прототипов).
А держать логику работы сложного компонента в view то ещё удовольствие, хотя бы потому что не позволяет повторно использовать код. В данном случае можно вообще обойтись без initComponent'a, и без всяких this. Ext.define('MyApp.Panel', { extend : 'Ext.Panel', defaultListenerScope: true, tellSomething : function () { console.log('Something'); }, tbar : [ { text : 'Click me', handler : 'tellSomething' } ] }); Для уровня представления ExtJS предлагает использовать именно декларативный стиль. |
Ребят, всем привет!
Почитав документацию про initComponent, я его убрал, лишь только по той причине что без него, мне, как начинающему, работать будет проще. Сделал так: items:[{ xtype: 'combobox', fieldLabel: 'Status', name: 'status', store: 'ContrAgents', valueField: 'id', displayField: 'name', typeAhead: true, queryMode: 'remote', value: 3,//Установил Значение по умолчанию listeners: { 'render': function (combo) { var id_record = combo.getValue(); var index = combo.getStore().indexOfId(id_record) console.log(index) //filterCombo(combo, index); } } }, Но в index значение -1. Почему? Как и советовали, сделал пример в Fiddle |
Потому что на этапе рендера, store может быть ещё не загружен.
Добавил отсебятины: Fiddle |
Часовой пояс GMT +3, время: 09:21. |