Мне очень трудно понять, как получить доступ к фактическому экземпляру виртуального хранилища для компонента, например, ComboBox или Grid. Похоже, что когда вы используете свой метод getStore, он возвращает другой экземпляр.ExtJS 5: Доступ к связанному хранилищу в компоненте
В моем example у меня есть пользовательский класс сетки, и в его initComponent я хочу добавить загрузчика загрузки. К сожалению, прослушиватель нагрузки никогда не попадает, но прослушиватель загрузки загруженного хранилища. Вы можете видеть, что слушатель настраивается до загрузки магазина, так что это не проблема. Похоже, что экземпляр store в initComponent является хранилищем памяти, поэтому экземпляр связанного хранилища не синхронизируется с компонентом на данный момент.
Я знаю, что у меня может быть слушатель нагрузки в связанном хранилище, но это настраиваемый класс сетки, и для любого настраиваемого класса сетки я хочу, чтобы там был настроен слушатель ... так что я не хочу чтобы делать это по всему месту в моем коде ... Я просто хочу его в одном классе, так как все они будут иметь ту же логику.
Может ли кто-нибудь объяснить мне, почему мой пользовательский загрузочный слушатель класса сетки не получает удар, и что я могу сделать, чтобы исправить это? Могу ли я каким-либо образом получить доступ к экземпляру связанного хранилища?
Ext.application({
name: 'Fiddle',
launch: function() {
Ext.define('MyGrid', {
extend: 'Ext.grid.Panel',
xtype: 'myGrid',
initComponent: function() {
alert('initComponent')
this.callParent();
this.getStore().on('load', this.onLoad, this);
},
onLoad: function() {
alert('grid store loaded');
}
});
Ext.define('MyViewController', {
extend: 'Ext.app.ViewController',
alias: 'controller.myview',
onLoadBoundStore: function() {
alert('loaded bound');
}
})
Ext.define('MyViewModel', {
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.myview',
stores: {
myStore: {
fields: ['name', 'value'],
autoLoad: true,
proxy: {
type: 'ajax',
url: 'data1.json',
reader: {
type: 'json'
}
},
listeners: {
load: 'onLoadBoundStore'
}
}
}
});
Ext.define('MyView', {
extend: 'Ext.form.Panel',
renderTo: Ext.getBody(),
controller: 'myview',
viewModel: {
type: 'myview'
},
items: [{
title: 'blah',
xtype: 'myGrid',
reference: 'myComboBox',
bind: {
store: '{myStore}'
},
columns: [{
text: 'Name',
dataIndex: 'name'
}, {
text: 'Value',
dataIndex: 'value'
}]
}]
});
Ext.create('MyView')
}
});
Вау, большое спасибо! Вы дали мне еще несколько последующих вопросов ... 'параметр конфигурации магазина требуется по правильному пути, но я привязываю магазин, так что вы фактически объявляете магазин, даже если вы привязываете его? Это кажется излишним. – incutonez
'Слушатели должны быть объявлены и обработаны в контроллерах (даже не в моделях вида, как в вашем примере). Итак, по этой логике вы говорите, что я не должен объявлять слушателей в представлении? Я думаю, что добавляет слишком много раздувания в контроллере ... тогда я должен искать все ссылки и добавлять слушателей ... это кажется немного ненужным, учитывая, что у меня есть удобный способ добавления слушателей. – incutonez
'this.lookupViewModel()' - очень интересная часть знаний ... с учетом 'this.getViewModel()' возвращает null. Похоже, последний является удобным getter для текущего уровня viewModel, а затем lookupViewModel идет до тех пор, пока не найдет один, который будет унаследованным. – incutonez