// 要利用观察者模式 去实现自定义的事件

     //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要利用观察者模式 去实现自定义的事件的更多相关文章

  1. 利用NSUserdefaults来存储自定义的NSObject类及自定义类数组

    利用NSUserdefaults来存储自定义的NSObject类及自定义类数组 1.利用NSUserdefaults来存储自定义的NSObject类 利用NSUserdefaults也可以来存储及获取 ...

  2. 巧妙利用JS中的自定义函数——化繁为简,提高效率

    利用自定义函数编写年月日时间表: (复杂写法)如下: <body>                <select id="year" size="1&q ...

  3. dedecms利用memberlist标签调用自定义会员模型的会员信息

    [摘要]本文讲一下dedecms如何利用memberlist标签调用自定义会员模型的会员信息. dedecms利用memberlist标签调用自定义会员模型的会员信息,这个问题找了很久,官方论坛提问过 ...

  4. 【java规则引擎】规则引擎RuleBase中利用观察者模式

    (1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变.(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想.可以利用观察者模式实现 ...

  5. 利用lsof去查看Unix/Linux进程打开了哪些文件

    利用lsof去查看Unix/Linux进程打开了哪些文件 今天用了一下lsof,发现这个linux的小工具,功能非常强大而且好用. 我们可以方便的用它查看应用程序进程打开了哪些文件或者对于特定的一个文 ...

  6. ocx中用自定义消息去调用自定义事件

    硬件发送消息---->接收到消息后调用回调函数DWORD __stdcall CxxxCtrl::FVI_NotifyCallBack(void *FVINOTIFYCallbackCtx,UI ...

  7. WPF自学入门(四)WPF路由事件之自定义路由事件

    在上一遍博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件.接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧. 创建自定义路由事件分为3个步骤: 1.声明并注册 ...

  8. spring中自定义Event事件的使用和浅析

    在我目前接触的项目中,用到了许多spring相关的技术,框架层面的spring.spring mvc就不说了,细节上的功能也用了不少,如schedule定时任务.Filter过滤器. intercep ...

  9. WPF:自定义路由事件的实现

    路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来 ...

随机推荐

  1. .NET的内存限制

    之前做点云的.Net程序,经常因为数据量大出现Outofmemory异常,但是看看任务管理器,内存还有好多剩余的,在网上搜了一下发现这样的解释. 不管系统内存多大,目前一个.NET 对象最多只能够使用 ...

  2. jQuery 的 ajax

    jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. $(selector).load ...

  3. Arcgis for android 离线查询

    参考.. 官方API demo ... 各种资料 以及.. ArcGIS for Android示例解析之高亮要素-----HighlightFeatures ttp://blog.csdn.net/ ...

  4. android studio问题rendering problems no render target selected

    activity_main.xml选择Design显示rendering problems no render target selected 在stackOverflow上找到了答案: You ne ...

  5. 关于const和define的内存分配问题的总结

    关于const和define的内存分配问题 const与#define宏定义的区别----C语言深度剖析 1,  const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静 ...

  6. IOS 网络浅析-(八 NSURLSession简介)

    就在不长也不短的时间前,苹果正式命令咱们要向NSURLSession看,因此我们不得不认认真真的听从老大的教导,努力认知NSURLSession.其实呢,三方早已为我们解决了问题,但是呢,我们还是有必 ...

  7. IOS 支付宝-五福简单框架实现-线性滚动(UICollectionView)

    猴年支付宝可算是给大家一个很好的惊喜,刺激.大家都在为敬业福而四处奔波.可是到最后也没有几个得到敬业福德,就像我.不知道大家有没有观察,五福界面的滚动是一个很好的设计.在这里,给大家带来简单的滚动实现 ...

  8. c语言中的部分字符串和字符函数

    // // main.c // homeWork1230 // // #include <stdio.h> #include <string.h> #include <c ...

  9. iOS中的触摸事件和手势处理

    iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...

  10. 《大话移动APP测试:Android与iOS应用测试指南》

    <大话移动app测试:android与ios应用测试指南> 基本信息 作者: 陈晔 出版社:清华大学出版社 ISBN:9787302368793 上架时间:2014-7-7 出版日期:20 ...