У меня есть контроллер с хранилищем, моделью и некоторыми представлениями .
Мне нужно прослушивать события beforesync
и write
хранилища в контроллере, но я не знаю, как установить эти прослушиватели в контроллерах control
-функция.
Мой магазин выглядит так:
Ext.define('DT.store.UsersStore', {
extend : 'Ext.data.Store',
model : 'DT.model.User',
id : 'myStore'
autoSync : true,
proxy : {
type : 'ajax',
api : {
read : '/load_entries',
update : '/update_entry'
},
reader : {
type : 'json',
root : 'user',
successProperty : 'success'
}
}
});
Теперь я пытаюсь прослушать события в моем контроллере:
...
init : function () {
this.control({
'myStore' : {
beforesync : this.doSomething,
write : this.doSomethingElse
}
});
},
...
Мой ожидаемый результат состоит в том, что функции будут выполняться, когда события запускаются . Но в настоящее время ничего не происходит, когда они запускаются.
Как я могу заставить это работать?
Ext.define('Store', {
model: 'Model',
extend: 'Ext.data.Store',
listeners: {
'beforesync': function(){
App.getController('somecontroller').onBeforeSync();
}
}
});
App - ваш объект приложения Функция onBeforeSync, которую вы можете реализовать в контроллере ... это единственный способ, которым я могу назначить событие хранилищу и при этом реализовать логику в контроллере. Я надеюсь, что это помогает
Я решил это сам.
Я добавил слушателя вручную в render
-вент моей панели
Ext.getCmp('userPanel').down('gridpanel').getStore().addListener('write',this.finishedLoading, this);
Спасибо за помощь @nscrob.
С этим связано обращение к экземпляру Ext.data.Store внутри Controller с использованием метода get контроллера: например, для вышеупомянутого «DT.store.UsersStore» с помощью this.getUsersStoreStore ():
обратите внимание, что если хранилище уже связано с представлением (например, было объявлено как свойство хранилища для сетки «UsersGrid»). panel.Panel определение виджета), тогда этот метод получения будет фактически извлекать другой экземпляр того же класса Store, а не экземпляр, используемый виджетом! Причина в том, что добавление хранилища в объект конфигурации конструктора выглядит следующим образом :
stores: ['UsersStore']
фактически добавит новый экземпляр хранилища в хеш Ext.data.StoreManager.map, так что - предположим, что «UsersStore» - единственный экземпляр хранилища, созданный на данный момент - ключи карты теперь выглядят так:
0: "ext-empty-store"
1: "UsersStore"
2: "myStore"
Теперь представьте, что вы хотите прочитать некоторые новые данные, используя прокси вашего магазина, и отобразить эти новые данные в «UsersGrid», и вы хотите делать все это, когда пользователь нажимает на что-то, поэтому внутри контроллера вы будет иметь метод-обработчик для пользовательского события с кодом:
'user-selector' : {
click: function(){
var oStoreReference = this.getUsersStoreStore();
oStoreReference.load( {params:{} });
}
}
Этот вызов для получения ссылки будет переведен внутри this.getStore ('UsersStore') и будет возвращать ссылку на сгенерированный контроллер - 1: "UsersStore" - а не - 2: "myStore" - как и следовало ожидать. Кроме того, вызов load () загрузит экземпляр UsersStore с новыми моделями, и это не будет отражено в вашем представлении сетки (поскольку сетка привязана и прослушивает события, сгенерированные экземпляром хранилища "myStore").
Так что лучше обращайтесь к хранилищу по его itemId, используя общий метод getStore: this.getStore ('storeItemId')
Почему бы просто не передать события магазина? Например:
this.getUsersGrid().relayEvents(this.getUsersStoreStore(), ['write'], 'store')
А затем сможете
this.control('somegrid-selector': {storeWrite: function(){...}})