Триггер контроллера ExtJS при нажатии гиперссылки
Я пытался заставить это работать довольно долго, но я все еще не смог найти решение для этого, кроме добавления afterrender внутри слушателей в представлении. Но я хочу, чтобы этим занимался контроллер.
есть ли у кого-нибудь идея о том, как я могу это решить?
вот что у меня в моих файлах на данный момент http://pastie.org/2751446
controller/App.js
Ext.define('HD.controller.App', {
extend: 'Ext.app.Controller'
,views: [
'core.Header',
'core.Navigation',
'core.Content'
]
,init: function() {
this.control({
'navigation a[id=tab1]': {
click: this.newTab
}
})
}
,newTab: function() {
console.log('Tab 1 should be loaded now');
}
});
вид / ядро / навигация.js
Ext.define('HD.view.core.Navigation', {
extend: 'Ext.panel.Panel'
,name: 'navigation'
,alias: 'widget.navigation'
,layout: 'accordion'
,region: 'west'
,width: 200
,title: 'Navigation'
,collapsible: true
,items: [
{
title: 'Title 1'
,html: '<a id="tab1" style="cursor:pointer;">Tab 1</a>'
},
{
title: 'Title 2'
,html: 'Second'
}
]
});
2 ответов
как вы пытаетесь ссылаться на гиперссылку a
не будет работать.
this.control({
'navigation a[id=tab1]': {
click: this.newTab
}
})
Это будет искать только компоненты ExtJS, а не элементы DOM. Скорее всего, вам придется прикрепить клик в afterrender или где-то похожем. Это не означает, что вы не можете оставить методы, которые выполняют всю работу в контроллере.
Edit:
var controller = this;
controller.control({
'navigation': {
afterrender: function() {
Ext.get('tab1').on('click', function() {
controller.newTab();
});
}
}
})
Я тоже боролся с проблемой. Суть в том, что конфигурация управления контроллером не работает как обычные слушатели и будет действовать только на события, которые запускаются компонентом, а не DOM, как указал s_hewitt.
альтернативы несколько уродливы с по существу слушателями на компонентах или родительских компонентах, где вы также можете использовать делегаты. Как только вы идете по этому маршруту, это не так чисто, как настройка слушателей в контроллер.
еще один трюк, который я использовал, чтобы обойти это ограничение, - это вызов методов контроллера из таких компонентов представления:
MyApp.app.getController('MyController').myFunction();