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

     //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. MySQL Cluster配置概述

    一.     MySQL Cluster概述 MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster .通过无共享体系结构,系统能够使用廉价的硬件,而 ...

  2. linux下firefox手工安装flash插件

    1. 前往adobe官网,下载flash安装包.下载.tar.gz安装包即可.2. 解压安装包,得到libflashplayer.so文件3. 新建文件夹,~/.mozilla/plugins4. 拷 ...

  3. Android--Apache HttpClient

    前言 上一篇文章介绍了使用HttpURLConnection来完成对于HTTP协议的支持.现在介绍一个新的方式来访问Web站点,那就是HttpClient. HttpClient是Apache开源组织 ...

  4. CoreAnimation(CA)

    开发者真会玩,原来我看到CA都懵了.啥是CA?原来就是Core Animation.哎,读书少啊,被虐成

  5. Web应用程序系统的多用户权限控制设计及实现-数据库设计【2】

    搭建一个Web权限配置的系统,需要以下五张数据表:人员表,分组表,页面表,目录表,操作权限表.各张数据表中用到的id均为自增1的标识,每张数据表的定义如下: 1.1人员表(operatorinfo)

  6. Swift中的类和结构体的相同点与不同点

     相同点: 1.都是有内部变量和函数 2.都可以有内部下标方式去取属性 3.都可以有初始化函数 4.都可以用协议   不同点: 1.类有继承 2.类可以多重引用 3.类有析构  

  7. [转]Designing a User Interface

    UI design can be divided into three essential elements : functionality, aesthetics, and performance. ...

  8. 设计模式C#实现(四)——迭代器模式

    迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. UML类图: 煎饼屋和餐厅合并了!但是有个小问题,虽然两家都同意实现相同的菜单项MenuItem,但是煎饼屋想使用A ...

  9. 烂泥:ubuntu安装vmtools

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近由于工作需要,需要使用桌面版的linux系统,所以就选择了ubuntu.同时为了方便使用,就在VM中安装ubuntu. 但是为了文件以及操作的方便就 ...

  10. uniq

    -c, --count 在每行前加上表示相应行目出现次数的前缀编号-d, --repeated 只输出重复的行-D, --all-repeated[=delimit-method 显示所有重复的行de ...