ExtJS要利用观察者模式 去实现自定义的事件
// 要利用观察者模式 去实现自定义的事件
//1:由于浏览器他自己能定义内置的事件(click/blur...)
// 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件)
var Observable = function(){
//承装自己所定义的事件类型的
this.events = ['start','stop'];
//我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下所示:
// 'start':[fn1 ,fn2....] ,
// 'stop':[fn1,fn2]
this.listeners = {
};
};
//2:添加新的自定义事件类型:
Observable.prototype.addEvents = function(eventname){
this.events.push(eventname);
};
//3:为自己的事件类型绑定响应的函数(添加事件监听)
Observable.prototype.addListener = function(eventname,fn){
//做一个容错的处理
if(this.events.indexOf(eventname) == -1){
this.addEvents(eventname);
}
//到这一步 ,必然存在这个事件类型了
var arr = this.listeners[eventname];
//如果当前这个函数数组不存在,那么我们要为这个事件类型绑定新添加的函数
if(!arr){
arr = [fn];
} else { //如果存在 当前这个事件类型所对应的函数的数组不为空
if(arr.indexOf(fn) == -1){
arr.push(fn);
}
}
//重新维护一下事件类型 和所绑定的函数数组的关联关系
this.listeners[eventname] = arr ;
};
//4:移除事件监听
Observable.prototype.removeListener = function(eventname,fn){
//如果你要移除的事件类型,在我的对象里没有被定义
if(this.events.indexOf(eventname) == -1){
return ;
}
//到这一步 就是你要移除的事件类型 是我当前对象里面存在的
var arr = this.listeners[eventname];
if(!arr){
return ;
}
//到这一步 证明arr里面是有绑定函数的
//判断 如果当前fn函数 在我的函数数组里存着 就移除
if(arr.indexOf(fn) != -1){
arr.splice(arr.indexOf(fn),1);
}
};
//5:如何让事件触发: 就是调用 这个事件类型所对应的所有的函数执行即可
Observable.prototype.fireEvent = function(eventname){
//如果当前没有传递事件类型名称或者当前传递的事件类型不存在我的对象里,直接返回
if(!eventname || (this.events.indexOf(eventname) == -1)){
return ;
}
//到这一步 一定存在这个事件
var arr = this.listeners[eventname];
if(!arr){
return ;
}
for(var i = 0 , len = arr.length ; i < len ; i ++){
var fn = arr[i];
fn.call(fn,this);
}
};
//javascript的习惯 给原型对象的方法 起一个简单的名字 方便开发者去使用
Observable.prototype.on = Observable.prototype.addListener;
Observable.prototype.un = Observable.prototype.removeListener;
Observable.prototype.fr = Observable.prototype.fireEvent;
//Observable 浏览器:
var ob = new Observable(); //被观察者
// 子类 继承Observable //观察者
var fn1 = function(){
alert('fn1....');
};
ob.on('start',fn1);
var fn2 = function(){
alert('fn2....');
};
ob.on('start',fn2);
//移除监听
ob.un('start',fn1);
ob.fr('start');
//ob.fr('stop');
ob.on('run',function(){
alert('run....');
});
ob.fr('run');
//Ext.util.Observable 类 是为了为开发者提供一个自定义事件的接口
//Ext.util.Observable
//观察者模式:(报社、订阅者) 被观察者、观察者
//Ext.util.Observable 被观察者
//所有继承(混入)Ext.util.Observable类的对象(子类) 观察者
ExtJS要利用观察者模式 去实现自定义的事件的更多相关文章
- 利用NSUserdefaults来存储自定义的NSObject类及自定义类数组
利用NSUserdefaults来存储自定义的NSObject类及自定义类数组 1.利用NSUserdefaults来存储自定义的NSObject类 利用NSUserdefaults也可以来存储及获取 ...
- 巧妙利用JS中的自定义函数——化繁为简,提高效率
利用自定义函数编写年月日时间表: (复杂写法)如下: <body> <select id="year" size="1&q ...
- dedecms利用memberlist标签调用自定义会员模型的会员信息
[摘要]本文讲一下dedecms如何利用memberlist标签调用自定义会员模型的会员信息. dedecms利用memberlist标签调用自定义会员模型的会员信息,这个问题找了很久,官方论坛提问过 ...
- 【java规则引擎】规则引擎RuleBase中利用观察者模式
(1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变.(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想.可以利用观察者模式实现 ...
- 利用lsof去查看Unix/Linux进程打开了哪些文件
利用lsof去查看Unix/Linux进程打开了哪些文件 今天用了一下lsof,发现这个linux的小工具,功能非常强大而且好用. 我们可以方便的用它查看应用程序进程打开了哪些文件或者对于特定的一个文 ...
- ocx中用自定义消息去调用自定义事件
硬件发送消息---->接收到消息后调用回调函数DWORD __stdcall CxxxCtrl::FVI_NotifyCallBack(void *FVINOTIFYCallbackCtx,UI ...
- WPF自学入门(四)WPF路由事件之自定义路由事件
在上一遍博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件.接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧. 创建自定义路由事件分为3个步骤: 1.声明并注册 ...
- spring中自定义Event事件的使用和浅析
在我目前接触的项目中,用到了许多spring相关的技术,框架层面的spring.spring mvc就不说了,细节上的功能也用了不少,如schedule定时任务.Filter过滤器. intercep ...
- WPF:自定义路由事件的实现
路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来 ...
随机推荐
- [mysql] timestamp自动更新和初始化
1.概述 在我们设计表的时候,考虑将行数据的创建时间和最后更新时间记录下来是很好的实践.尤其是可能需要做数据同步或者对数据新鲜度有要求的表.举些应用场景,更新距上次更新超过2小时的行数据,或者是将一个 ...
- ASP.NET本质论第一章网站应用程序学习笔记1
1.统一资源标示符 1) 格式:协议://主机[.端口号][绝对路径[?参数]],在Http://www.kencery.com/hyl/index/login中,http表示协议的名称,www.ke ...
- 项目、SVN clean的一些事
1.如果你发现你的文件修改了.Tomcat也重新了,但访问的还是旧的文件,这个时候你需要clean下你的项目. Clean will discard all build problems and bu ...
- RHEL7进程管理
进程概念 名称 说明 程序 一组指令的集合 进程 程序的执行就是进程也可以把进程看成一个独立的程序在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己进程是资源分配的基本单位,也 ...
- 卸载WIN10自带功能
要卸载OneNote,在里面输入 Get-AppxPackage *OneNote* | Remove-AppxPackage 可以复制,回车执行 4 要卸载3D,输入 Get-AppxPackage ...
- [leetcode] Reverse Bits
Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (re ...
- IOS CALayer(一)
对于一个app的好坏,我们首要判断的便是app的界面,而界面的建立则是在图形的处理基础上的,说到图形处理又不得不提及Quartz2D,CALayer. 在iOS系统中,你能看得见摸得着的东西基本上都是 ...
- virtualbox 安装 虚拟机的时候报错不能创建新任务
找到原因是因为自己的windows是破解的, 找到C:\Windows\system32\uxtheme.dll这个文件,我的破解的windows在这里自带了一个uxtheme.dll.backup的 ...
- 【转载】主数据管理(MDM)与元数据管理
主数据(Master Data)和元数据(Meta Data)是两个完全不同的概念.元数据是指表示数据的相关信息,比如数据定义等,而主数据是指实例数据,比如产品目录信息等.比如,某省地税开发了一套 征 ...
- jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验
一.下载插件包. 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.jQuery表单验证插件----添加class属性形式的校验 <!DOCTY ...