javascript 使用事件路由对模块解耦
2014-04-06 23:29
429 查看
最近接手,维护起来非常吃力,如果要增加一个功能,需要从头改到尾,更让人崩溃的是,在这个页面中使用了不七八个全局变量进行状态标识。这个页面的规模已经可以算是一个中小应用的规模。对下调用底层话路OCX对象,进行各种话路功能的调用,并处理底层话路OCX的状态。对上则相应用户的操作,并更新UI。
举个例子,现在的情况是:
假如有AB两个模块,现在AB两个模块的状态是硬编码在一起的:
如果增加模块C,C的状态是由A的状态控制的,目前要实现C的功能则需要修改A模块的代码:
状态一多,模块一多,维护起来就是一个噩梦。
针对这种情况,使用事件机制,即使一个很简单的一种,也可以大大改观目前的这个状况。
我自己实现了一个简单版本的详细路由器:
这样模块间状态的依赖,通过事件通知进行触发,当增加新模块时,不用再修改原来的代码。
当然这个事件路由的代码很简单,目前有很多非常成熟的开源JS模块专门做事件这一块,比如:amplify 。
举个例子,现在的情况是:
假如有AB两个模块,现在AB两个模块的状态是硬编码在一起的:
if(A.A1){ B.B1(); } if(A.A2){ B.B2(); }
如果增加模块C,C的状态是由A的状态控制的,目前要实现C的功能则需要修改A模块的代码:
if(A.A1){ B.B1(); C.C1(); } if(A.A2){ B.B2(); C.C2(); }
状态一多,模块一多,维护起来就是一个噩梦。
针对这种情况,使用事件机制,即使一个很简单的一种,也可以大大改观目前的这个状况。
我自己实现了一个简单版本的详细路由器:
(function(window){ var eventsQueue = {}, Component = function(){}; Component.prototype={ on:function(event,callback){ if(eventsQueue[event] && eventsQueue[event].push){ eventsQueue[event].push(callback); } else{ eventsQueue[event] = [callback]; } return this; }, emit:function(event,data){ if(eventsQueue[event] && eventsQueue[event].push){ for(var i=2; i<eventsQueue[event].length; i++){ eventsQueue[event][i].call(data); } } return this; } }; window.Component = Component; }(window));
这样模块间状态的依赖,通过事件通知进行触发,当增加新模块时,不用再修改原来的代码。
var A = new Component(); var B = new Component(); B.on("A1",function(){ B.B1(); }); B.on("A2",function(){ B.B2(); }); var C = new Component(); C.on("A1",function(){ C.C1(); }); C.on("A2",function(){ C.C2(); }); A.emit("A1"); A.emit("A2");
当然这个事件路由的代码很简单,目前有很多非常成熟的开源JS模块专门做事件这一块,比如:amplify 。
相关文章推荐
- 以中间件,路由,跨进程事件的姿势使用WebSocket--Node.js篇
- 使用javaScript控制某一控件的点击事件[兼容IE和FF]
- javascript使用右键事件
- 史上最详细的JavaScript事件使用指南
- 关于如何使用javascript监听滚动条滚动事件
- 理解JavaScript中的事件路由冒泡过程及委托代理机制
- Javascript - 正确使用div的mouseout事件
- javascript计时器事件使用详解
- JavaScript 使用div替换button 点击事件
- 以中间件,路由,跨进程事件的姿势使用WebSocket
- javascript中express模块的使用
- 详解javascript事件绑定使用方法
- 详解javascript事件绑定使用方法
- 关于A标签使用onclick事件的疑问,若是href="#",跳转无反应,以及href=#与href=javascript:void(0)的区别
- JavaScript怎样使用COM组件的事件
- javascript举例介绍事件委托的典型使用场景
- javascript 的onclick和click 在 ie 和mozilla中的使用 ;jquery 的dom事件绑定
- 史上最详细的JavaScript事件使用指南
- Android项目解耦--路由框架ARouter的使用