我有这样的GridPanel:
Ext.define('BM.view.test.MacroList', {
extend: 'BM.view.GridPanel',
alias:'widget.macro-test-list',
store: 'Tests',
initComponent: function() {
this.columns = [
{
xtype:'actioncolumn',
width:50,
items: [
{
icon: 'images/start.png',
tooltip: 'Start Test',
handler: function(grid, rowIndex, colIndex) {
this.application.fireEvent('testStart', grid.getStore().getAt(rowIndex));
// application not defined here because 'this' is the button.
}]
}]
}
}
stratTest是,将可以从应用程序中的很多地方的功能,我想它可以作为一个应用广泛的事件,但这些似乎只能从控制器。
如何调用.application.fireEvent('testStart'...)
从这个按钮内部的处理程序?
我用这个问题作为一个经常提及的事件,并煎茶文档,但无法找到答案。
你得到this.application
控制器范围内。
给你有明确使用MVC在这里,我会说这是最好坚持MVC的概念; 也就是说,可重用的缘故,组件不应该知道什么控制器使用它,而是控制器应该知道它使用什么成分。
所以,你应该认真倾听控制器中的事件,并从那里触发一个应用程序事件。
问题是,有从控制器actioncolumn处理程序不能访问(它在内部调用Ext.grid.column.Action
processEvent()
所以,你最好的拍摄是火视图中的新事件:
this.columns = [
{
xtype:'actioncolumn',
...
items: [
{
...
handler: function( aGrid, aRowIndex, aColIndex, aItem, aEvent, aRecord ) {
this.fireEvent( 'columnaction', aGrid, aRowIndex, aColIndex, aItem, aEvent, aRecord); }
}]
}]
也请注意,你可以定义一个全局处理程序栏,如下所示:
this.columns = [
{
xtype:'actioncolumn',
handler: function( aGrid, aRowIndex, aColIndex, aItem, aEvent, aRecord ) {
this.fireEvent( 'columnaction', aGrid, aRowIndex, aColIndex, aItem, aEvent, aRecord); }
...
items: [
{
...
}]
}]
再搭上控制器此事件。
init: function() {
this.control({
'macro-test-list actioncolumn':{
columnaction: this.onAction
}
});
},
onAction: function( aGrid, aRowIndex, aColIndex, aItem, aEvent, aRecord ) {
this.application.fireEvent( 'testStart', aGrid.getStore().getAt( aRowIndex ) );
}
请注意,顺便说一句,这给了你正在做什么,更清洁的代码如下:
onAction: function( aGrid, aRowIndex, aColIndex, aItem, aEvent, aRecord ) {
this.application.fireEvent( 'testStart', aRecord );
}
在射击应用范围的自定义事件而言,现在的ExtJS V5.1发布之后的新方法,它是利用Ext.GlobalEvents。
当你火事件,你这样做:
Ext.GlobalEvents.fireEvent('custom_event',args);
当您注册事件的处理程序,你这样做:
var obj = Ext.create('Ext.form.Panel', {
// ....
});
Ext.GlobalEvents.on('custom_event', function(arguments){
/* handler codes*/
}, obj};
此方法并不限于控制器。 任何组件都可以通过把组件对象作为输入参数范围处理自定义事件。
这里是一个小提琴 。
APPNAME.getApplication.fireEvent()是可用的应用范围。