组件事件管理(Component Event Management)

更新记录
发布。
2022年6月25日 从笔记迁移到博客。

ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html

组件事件管理(Component Event Management)

添加监听事件(Adding Listeners)#

说明#

支持三种监听事件的方式:
使用组件的listeners配置项监听内置事件(Built-in events using listeners)
在创建类型实例后添加事件监听(Attaching events later)
自定义事件和监听(Custom events)

使用listeners属性监听内置事件(Built-in events using listeners)#

只需要将监听的事件名称和事件处理程序放在listeners属性里面即可

{
    xtype: 'button',
    text: '按钮',
    renderTo: Ext.getElementById('btn'),
    listeners:{
        click: function(e){
            Ext.MessageBox.alert('提示','你点击了按钮');
        }
    }
}

可以在listeners配置项中添加多个事件监听

{
    xtype: 'button',
    text: '按钮',
    renderTo: Ext.getElementById('btn'),
    listeners:{
        click: function(e){
            this.hide();
        },
        hide: function(e){
            Ext.MessageBox.alert('提示','你按钮隐藏了');
            var that = this;
            setInterval(function(){ that.show(); },2000);
        }
    }
}

还可以设定事件监听的参数

{
    xtype: 'button',
    text: '按钮',
    renderTo: Ext.getElementById('btn'),
    defaultListenerScope: true, //设置事件默认scope为this
    listeners:{
        click: {
            fn:function(e){
                this.hide();
            }
        },
        hide: {
            fn: function(e){
                Ext.MessageBox.alert('提示','你按钮隐藏了');
                var that = this;
                setInterval(function(){ that.show(); },2000);
            }
        }
    }
}

在创建对象或之后添加事件监听(add listeners after the instance is created)#

使用on()方法即可(类似jQuery)

Ext.on ( eventName, [fn], [scope], [options], [order] ) : Object 

options支持的Key:https://docs.sencha.com/extjs/7.3.1/classic/Ext.html#method-on
注意:Ext.on()方法是Ext.GlobalEvents.addListener()方法的别名

实例:

var button = Ext.create('Ext.Button', {
    renderTo: Ext.getBody(),
    text: 'My Button'
});

button.on('click', function () {
    Ext.Msg.alert('Success!', 'Event listener attached by .on');
});

在对象外部添加多个事件,也可以使用on方法

var button = Ext.create('Ext.Button', {
    renderTo: Ext.getBody(),
    text: 'My Button'
});

button.on({
    mouseover: function() {
        //do
    },
    hide: function() {
        //dog
    }
});

还可以更细致的定义监听函数

button.on({
    cellclick: {
        fn: 'onCellClick',
        scope: this,
        single: true
    },
    viewready: {
        fn: 'onViewReady',
        scope: panel
    }
});

自定义事件和监听(Custom events)#

只需要将自定义事件名称和事件处理程序放在listeners配置项里面即可
然后使用.fireEvent()方法触发即可

var button = Ext.create('Ext.Button', {
    renderTo: Ext.getBody(),
    text: 'Click Me',
    listeners: {
        //自定义事件
        pandaEvent: {
            single: true,
            fn: function() {
                Ext.Msg.alert('Success!', 'Success');
            }
        }
    }
});
//触发事件
button.fireEvent('pandaEvent');

在对象外部定义自定义事件并触发

//定义对象
var PandaContainer = Ext.create('Ext.container.Container',{
    listeners:{
        
    }
});
//绑定事件
PandaContainer.on('PandaEvent',function(){
    console.log('PandaEvent Is Fired');
});
//触发事件
PandaContainer.fireEvent('PandaEvent');//PandaEvent Is Fired

组件实现观察者模式#

还可以使用Ext.util.Observable类型可以进行实现观察者模式进行创建自定义事件

//自定义组件
Ext.define('Panda.test.Component',{
    //混入Ext.util.Observable
    mixins: {observable: 'Ext.util.Observable'},
    //Other Code.....
    constructor: function( config ){
        //调用observable的构造函数
        this.mixins.observable.constructor.call( this, config );
    },
    //自定义事件
    quitJob: function(){
        //触发事件
        this.fireEvent('quit', 'abc', new Date(), 2,1, 'more params...' );
    }
});

//实例化组件
var patricia = Ext.create('Panda.test.Component', {
    listeners:{
        //监听事件
        'quit':function(EmployeeName, quitDate, param, paramb, paramc){
            console.log('Event quit launched');
            console.log('Employee:' + EmployeeName);
            console.log('Date:'+ Ext.util.Format.date(quitDate,'Y-m-d H:i'));
            console.log('Param :' + param);
            console.log('Param B:' + paramb);
            console.log('Param C:' + paramc);
        }
    }
});

//触发事件
patricia.quitJob();

设置事件处理函数只执行一次#

把single配置项设置为true即可

var button = Ext.create('Ext.Button', {
    renderTo: Ext.getBody(),
    text: 'Click Me',
    listeners: {
        click: {
            single: true,
            fn: function() {
                Ext.Msg.alert('Success!', 'I will say this only once');
            }
        }
    }
});

设置事件处理函数的作用域(Scope Listener Option)#

默认情况下,事件处理程序的作用域为触发事件的类的实例
这通常是您想要的功能,但并不总是如此
使用scope项设置事件处理程序的作用域

var panel = Ext.create('Ext.Panel', {
    html: 'Panel HTML'
});

var button = Ext.create('Ext.Button', {
    renderTo: Ext.getBody(),
    text: 'Click Me'
});

button.on({
    click: function() {
        Ext.Msg.alert('Success!', this.getXType());
    },
    scope: panel
});

还可以使用defaultListenerScope配置项设置组件默认的事件作用域

{
    xtype: 'button',
    text: '按钮',
    renderTo: Ext.getElementById('btn'),
    defaultListenerScope: true, //设置事件默认scope为this
    listeners:{
        click: {
            fn:function(e){
                this.hide();
            }
        },
        hide: {
            fn: function(e){
                Ext.MessageBox.alert('提示','你按钮隐藏了');
                var that = this;
                setInterval(function(){ that.show(); },2000);
            }
        }
    }
}

设置事件缓冲#

对于短时间内多次发生的事件,我们可以减少事件触发的次数
通过使用缓冲区配置调用侦听器
使用buffer配置项即可,值是缓冲的时间

{
    xtype: 'button',
    renderTo: Ext.getBody(),
    text: 'Click Me',
    listeners: {
        click: {
            buffer: 2000, //设置缓冲2秒
            fn: function() {
                Ext.Msg.alert('Success!', 'Success!');
                console.log("Success");
            }
        }
    }
}

移除事件(Remove Listeners)#

说明#

移除事件需要使用指定的事件名称
注意:不可以移除匿名函数

移除事件监听#

使用un方法即可

Ext.un ( eventName, fn, [scope] )

注意:Ext.un()方法是Ext.GlobalEvents.removeListener()方法的快捷别名

var doSomething = function() {
    Ext.Msg.alert('Success!', 'listener called');
};

var button = Ext.create('Ext.Button', {
    renderTo: Ext.getBody(),
    text: 'My Button',
    listeners: {
        click: doSomething,
    }
});

Ext.defer(function() {
    button.un('click', doSomething);
}, 3000);

手动触发事件(Trigger Event)#

调用fireEvent方法即可(可以触发 预定义的事件 或 自定义的组件事件)

Ext.fireEvent ( eventName, args ) : Boolean 

注意:fireEvent是Ext.GlobalEvents.fireEvent的快捷方法

实例:

var button = Ext.create('Ext.Button', {
    renderTo: Ext.getBody(),
    text: 'Click Me',
    listeners: {
        //自定义事件
        pandaEvent: {
            sigle: true,
            fn: function() {
                Ext.Msg.alert('Success!', 'Success');
            }
        }
    }
});
//触发事件
button.fireEvent('pandaEvent');

按钮快捷点击事件绑定#

按钮可以使用handler配置项,快速配置按钮的点击事件

{
    xtype: 'button',
    text: 'Button',
    renderTo: Ext.getBody(),
    handler: function(){    //快捷方式
        console.log('Clicked');
    }
}

onXXX方法(on method)#

除了在listeners中配置事件处理函数,还可以直接定义组件的onXXX事件处理函数

实例:直接定义onMouseOver()方法,监听鼠标hover事件

{
    xtype: 'button',
    text: 'Button',
    renderTo: Ext.getBody(),
    onMouseOver: function () {
        console.log('Button Mouseover Event Fired');
    }
}

作者:重庆熊猫

出处:https://www.cnblogs.com/cqpanda/p/16468622.html

版权:本作品采用「不论是否商业使用都不允许转载,否则按3元1字进行收取费用」许可协议进行许可。

posted @   重庆熊猫  阅读(215)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示