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

  1 // 要利用观察者模式 去实现自定义的事件
  2
  3
  4     //1:由于浏览器他自己能定义内置的事件(click/blur...)
  5     //  我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件)
  6     var Observable = function(){
  7         //承装自己所定义的事件类型的
  8         this.events = [‘start‘,‘stop‘];
  9         //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下所示:
 10         //                                            ‘start‘:[fn1 ,fn2....] ,
 11         //                                            ‘stop‘:[fn1,fn2]
 12         this.listeners = {
 13
 14         };
 15     };
 16
 17     //2:添加新的自定义事件类型:
 18     Observable.prototype.addEvents = function(eventname){
 19         this.events.push(eventname);
 20     };
 21
 22
 23     //3:为自己的事件类型绑定响应的函数(添加事件监听)
 24     Observable.prototype.addListener = function(eventname,fn){
 25         //做一个容错的处理
 26         if(this.events.indexOf(eventname) == -1){
 27             this.addEvents(eventname);
 28         }
 29         //到这一步 ,必然存在这个事件类型了
 30         var arr = this.listeners[eventname];
 31         //如果当前这个函数数组不存在,那么我们要为这个事件类型绑定新添加的函数
 32         if(!arr){
 33             arr = [fn];
 34         } else {    //如果存在 当前这个事件类型所对应的函数的数组不为空
 35             if(arr.indexOf(fn) == -1){
 36                     arr.push(fn);
 37             }
 38         }
 39         //重新维护一下事件类型 和所绑定的函数数组的关联关系
 40         this.listeners[eventname] = arr ;
 41     };
 42
 43     //4:移除事件监听
 44     Observable.prototype.removeListener = function(eventname,fn){
 45         //如果你要移除的事件类型,在我的对象里没有被定义
 46         if(this.events.indexOf(eventname) == -1){
 47             return ;
 48         }
 49         //到这一步 就是你要移除的事件类型 是我当前对象里面存在的
 50         var arr = this.listeners[eventname];
 51         if(!arr){
 52             return ;
 53         }
 54         //到这一步 证明arr里面是有绑定函数的
 55         //判断 如果当前fn函数 在我的函数数组里存着 就移除
 56         if(arr.indexOf(fn) != -1){
 57             arr.splice(arr.indexOf(fn),1);
 58         }
 59     };
 60
 61     //5:如何让事件触发: 就是调用 这个事件类型所对应的所有的函数执行即可
 62     Observable.prototype.fireEvent = function(eventname){
 63         //如果当前没有传递事件类型名称或者当前传递的事件类型不存在我的对象里,直接返回
 64         if(!eventname || (this.events.indexOf(eventname) == -1)){
 65             return ;
 66         }
 67         //到这一步 一定存在这个事件
 68         var arr = this.listeners[eventname];
 69         if(!arr){
 70             return ;
 71         }
 72         for(var i = 0 , len = arr.length ; i < len ; i ++){
 73                 var fn = arr[i];
 74                 fn.call(fn,this);
 75         }
 76     };
 77
 78     //javascript的习惯    给原型对象的方法 起一个简单的名字 方便开发者去使用
 79     Observable.prototype.on = Observable.prototype.addListener;
 80     Observable.prototype.un = Observable.prototype.removeListener;
 81     Observable.prototype.fr = Observable.prototype.fireEvent;
 82
 83
 84
 85     //Observable 浏览器:
 86     var ob = new Observable(); //被观察者
 87     // 子类  继承Observable        //观察者
 88     var fn1 = function(){
 89         alert(‘fn1....‘);
 90     };
 91     ob.on(‘start‘,fn1);
 92
 93     var fn2 = function(){
 94         alert(‘fn2....‘);
 95     };
 96     ob.on(‘start‘,fn2);
 97
 98     //移除监听
 99     ob.un(‘start‘,fn1);
100     ob.fr(‘start‘);
101     //ob.fr(‘stop‘);
102
103     ob.on(‘run‘,function(){
104         alert(‘run....‘);
105     });
106     ob.fr(‘run‘);
107
108
109
110     //Ext.util.Observable 类 是为了为开发者提供一个自定义事件的接口
111     //Ext.util.Observable
112     //观察者模式:(报社、订阅者) 被观察者、观察者
113     //Ext.util.Observable 被观察者
114     //所有继承(混入)Ext.util.Observable类的对象(子类)  观察者
115
116
117
118
119
120
121
122
123
124     
时间: 2024-08-07 00:13:57

ExtJS要利用观察者模式 去实现自定义的事件的相关文章

Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 ),利用RTTI实现Delphi的多播事件代理研究

Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 )http://www.cnblogs.com/hezihang/p/6083555.html 利用RTTI实现Delphi的多播事件代理研究http://www.cnblogs.com/hezihang/p/3299481.html

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

(1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变.(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想.可以利用观察者模式实现.基于易变动的数据结构中加入监听者,监听者依据被监听者的变动动作,定义自己的动作.在监听者内部通知其他组件做出相应改变.实现面向对象的思想.组建之间实现了解藕. 一:被监听数据,也就是规则网络RuleBase的接口定义 1 package com.nonbankcard.commons.doorls

3、关于利用SqlSessionFactoryBuilder去构建SqlSessionFactory,以及Mybatis的dao的实现

1.关于利用SqlSessionFactoryBuilder去构建SqlSessionFactory // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFa

Android下怎么利用webView去调用JS里面的方法

在之前几遍博客中讲到了怎么利用JS去调用Android的本地代码. 其实很简单, 在Android本地代码中: webView.loadUrl("javascript:sayHello()"); 然后在html中: function sayHello(){ document.getElementById('userinfo').innerHTML="哈哈哈哈哈哈"; } 就是这简单. Android WebView开发问题及优化汇总

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

在我目前接触的项目中,用到了许多spring相关的技术,框架层面的spring.spring mvc就不说了,细节上的功能也用了不少,如schedule定时任务.Filter过滤器. interceptor拦截器等等,而这一篇我要说的是spring Event自定义事件,目前的项目中似乎没怎么用,但是这一项技术貌似还蛮重要,所以也不能不掌握. 对于事件驱动模型的解释和理解,我觉得有一篇博客里说的非常好,尤其是在解释这个关系的时候,举的交通信号灯的例子非常贴切,这里就引用做一个简单的解释: 事件驱

WPF自定义路由事件

一 概要 本文通过实例演示WPF自定义路由事件的使用,进而探讨了路由事件与普通的CLR事件的区别(注:"普通的CLR事件"这个说法可能不太专业,但是,我暂时也找不到什么更好的称呼,就这么着吧,呵呵.)(扩展阅读:例说.NET事件的使用). 二 实例演示与说明 1 新建DetailReportEventArgs类,该类派生自RoutedEventArgs类,RoutedEventArgs类包含与路由事件相关的状态信息和事件数据.DetailReportEventArgs类中定义了属性Ev

WPF自定义路由事件(二)

WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 WPF中的大多数事件都是路由事件,WPF有3中路由策略: 具体不多讲,单需要注意的是WPF路由事件是沿着VIsualTree传递的.VisualTree与LogicalTree的区别在于:LogicalTree的叶子节点是构成用户界面的控件(xaml紧密相关),而VisualTree要连控件中的细微结构也

微信公众号的自定义菜单事件推送

1.创建自定义菜单 2.组装自定义菜单(JSON格式数据) 微网站:可以实现跳转到微信响应式页面 产品中心:可以实时获取服务器端产品信息,并以图文形式返回 关于我们:可以返回相关的文本信息 微网站:跳转链接 产品中心与关于我们:内部请求 请求代码,请参menu.php页面,创建成功,请取消关注微信公众账号并再次关注,效果如图 3.自定义菜单事件推送 A.接收相关参数(Event和EventKey) 在之前的api.php之中添加代码 B.对参数进行判断与操作 上传代码,效果如下图所示

自定义路由事件

自定义路由事件大体上可分为三个步骤: 1.声明并注册路由事件: 2.为路由事件添加CLR事件包装: 3.创建可以激发路由事件的方法. 主要的示例代码如下: public class TimeButton : Button { /// <summary> /// 声明并注册路由事件. /// </summary> public static readonly RoutedEvent ReportTimeEvent = EventManager.RegisterRoutedEvent(