击发按钮处理应用程序范围内的事件(Firing application wide events fr

2019-09-22 01:28发布

我有这样的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'...)从这个按钮内部的处理程序?

我用这个问题作为一个经常提及的事件,并煎茶文档,但无法找到答案。

Answer 1:

你得到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 );
}


Answer 2:

在射击应用范围的自定义事件而言,现在的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}; 

此方法并不限于控制器。 任何组件都可以通过把组件对象作为输入参数范围处理自定义事件。

这里是一个小提琴 。



Answer 3:

APPNAME.getApplication.fireEvent()是可用的应用范围。



文章来源: Firing application wide events from button handlers