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

     //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. JS 面向对象 编程设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  2. SQL Server Merge语句的使用

    Merge关键字在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插 ...

  3. Android 计算布局背景的透明度

    1.#ff000000 此为16进制颜色代码,前2位ff为透明度,后6位为颜色值(000000为黑色,ffffff为白色,可以用ps等软件获取). 2.透明度分为256阶(0-255),计算机上用16 ...

  4. Maven学习——安装与修改Maven的本地仓库路径

    一.Maven的下载安装配置 1.1.下载 官网 http://maven.apache.org/download.cgi 1.2.安装配置 apache-maven-3.3.3-bin.zip 解压 ...

  5. IOS 杂笔-19(属性与变量的优缺点)

    IOS 杂笔-19(属性与变量的优缺点) 在前面的文章中我介绍了属性与变量的区别.这篇博客我将会简单介绍一下属性与变量的优缺点. 变量 优点: 访问速度快 缺点: 使用不灵活 属性 缺点: 耗时 优点 ...

  6. IOS之UI--小实例项目--添加商品和商品名

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. java集合 之 Map集合

    Map用于保存具有映射关系的数据,具有两组值:一组用于保存Map中的key:另一组用于保存Map中的value,形成key-value的存储形式. Map集合中包含的一些方法: void clear( ...

  8. gradle研究

    gradle介绍:http://www.oschina.net/p/gradle gradle官网:https://gradle.org gradle的  eclipse 插件:http://www. ...

  9. Linux与Windows共享文件夹之samba的安装与使用(Ubuntu为例)

    1.写在前面     当你在Windows上安装了一台Linux的虚拟机,你想访问Linux中的文件夹,将虚拟机中的文件复制到Windows主机上,你会怎么做呢?如果这台Linux主机不是虚拟机,而是 ...

  10. SAM4E单片机之旅——15、触屏输入与SPI通信

    开发板上配了一个电阻触摸屏,它的控制器是ADS7843,使用SPI进行通信.这次实现的功能是通过SPI接口与该控制器交互,获取触摸屏点击的坐标,并显示在LCD上.略为难点的是SPI作为同步时钟的一种, ...