extjs - как правильно вызвать метод контроллера из другого контроллера или замыкания
Я новичок в extjs и использую архитектуру MVC.
Когда мое приложение ссылается на метод контроллера, я делаю это таким образом (вMyApp.Application
):
Mb.app.getController('Main').myMethod();
Это уже давно, но я думаю, что это способ сделать.
Когда контроллер вызывает свой собственный метод в замыкании, я был вынужден использовать этот код (вMyApp.controller.Main
:
controllerMethodOne: function(){
Ext.Ajax.request({
url: ...,
params: ...,
success: (function(response){
list = Ext.JSON.decode(response.responseText);
list.forEach(function(item){
storeMenu.add(
Ext.create('Ext.menu.Item', {
text: item.text,
handler: function(el){MyApp.app.getController('Main').controllerMethodTwo()}
})
)
})
})
})
},
Я ссылался на метод сMyApp.app.getController('Main').controllerMethodTwo()
потому чтоthis
не ссылается на объект контроллера в замыкании, и, таким образом,this..controllerMethodTwo()
не работает
Я нахожу это совершенно запутанным, и я надеюсь, что у кого-то есть идея обойти этоMyApp.app.getController
-workaround.
Благодаря всем предложениям я смог оптимизировать свой код и придумал:
// in my controller
mixins: ['Mb.controller.mixin.StoreMenu'],
// I use that style of menus in two controllers thats why I use a mixin
init: function() {
this.control({
'#vg_storeMenu menuitem': {
click: this.onStoreMenuClicked
}
})
},
// the controller mixin
Ext.define('Mb.controller.mixin.StoreMenu', {
extend: 'Ext.app.Controller',
buildStoreMenu: function(store_name){
var storeMenu = Ext.ComponentQuery.query('#' + store_name + 'Menu')[0];
Ext.Ajax.request({
url: Paths.ajax + 'json.php',
params: {list: store_name + 's'},
success: (function(response){
list = Ext.JSON.decode(response.responseText);
items = Ext.Array.map(list, function(item) {
return {
xtype: 'menuitem',
text: item.text
}
});
storeMenu.add(items);
})
})
},
onStoreMenuClicked: function(el){
...
}
});