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方法来 ...
随机推荐
- ASP.NET本质论第一章网站应用程序学习笔记1
1.统一资源标示符 1) 格式:协议://主机[.端口号][绝对路径[?参数]],在Http://www.kencery.com/hyl/index/login中,http表示协议的名称,www.ke ...
- [原创]html5游戏_五线谱打音符
html5手机游戏—五线谱打音符 1.[用五线谱打唱名] 2.[用唱名打五线谱] 3.[无限练习模式] 用来熟悉五线谱上音符的位置 代码不难,这回注释还是有认真写的[只是废代码没有全部删除...] 效 ...
- SharePoint 2013 跨网站集发布功能简介
在SharePoint Server 2013网站实施中,我们经常会遇到跨网站集获取数据,而2013的这一跨网站集发布功能,正好满足我们这样的需求. 使用SharePoint 2013中的跨网站发布, ...
- python多线程ssh爆破
python多线程ssh爆破 Python 0x01.About 爆弱口令时候写的一个python小脚本,主要功能是实现使用字典多线程爆破ssh,支持ip表导入,字典数据导入. 主要使用到的是pyth ...
- iOS--九宫格奥秘(UIView)(arc4random)
下面程序主要实现,九宫格的模型,每个小UIView的颜色随机产生的,用到了 arc4random函数: ; ; ; ; ; i<; i++) { ; j<; j++) { UIView * ...
- 关于tableView中tableHeaderView/tableFooterView/sectionHeader/sectionFooter/contentInset的理解
其实每个人的理解有所不同,找到最有利于自己的理解方式即可.有人把Cell,tableHeaderView,tableFooterView,sectionHeader,sectionFooter这些属性 ...
- 傅里叶:有关FFT,DFT与蝴蝶操作(转 重要!!!!重要!!!!真的很重要!!!!)
转载地址:http://blog.renren.com/share/408963653/15068964503(作者 : 徐可扬) 有没有!!! 其实我感觉这个学期算法最难最搞不懂的绝对不是动态规划 ...
- linux---文本编辑vi
本文摘自:鸟哥的linux私房菜
- Effective Java 46 Prefer for-each loops to traditional for loops
Prior to release 1.5, this was the preferred idiom for iterating over a collection: // No longer the ...
- Linux系统搭建LAMP平台
知识背景(来自:百度百科): LAMP指的Linux(操作系统).Apache HTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一 ...