`

关于实现Extjs动态加载类的方式实现

阅读更多

 

Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方式有些类似,在每一个类中需要使用其他类的时候像java一样先improt再使用。先看使用方式:

	Ext.setPath("ThinkOA", "app");//将命名空间ThinkOA映射成webContent下的app文件夹,这样凡ThinkOA的命名空间的类都会去app目录下加载
	Ext.setPath("Ext.ux", "resources/ux");//将命名空间Ext.ux映射成webContent下的resources/ux文件夹路径,这样凡Ext.ux的命名空间的类都会去resources/ux目录下加载
	Ext.loadJs("ThinkOA/ns.js");//加载ns.js文件
	Ext.loadJs("ThinkOA/constant.js");
	
	Ext.require("ThinkOA.Viewport");//导入自定义类ThinkOA.Viewport 需要保证app目录下有名称为Viewprot.js文件,里面的类名称必须是ThinkOA.Viewport
	Ext.require("ThinkOA.LoginWindow");//导入自定义类ThinkOA.LoginWindow
	new ThinkOA.LoginWindow({
		isDebug: false,
		loginUrl: "login.do",//Ext.ParamMgr.getValue("login.url"),
		
		listeners: {
			scope: this,
			submit: function(win, jsonObject) {
				if (jsonObject.success) {
					new ThinkOA.Viewport({
					});
					win.close();
				}else {
					Ext.MessageBox.alert("提示",jsonObject.message);
				} 
			}
		}
	
	}).show();

 js文件目录结构如下:js目录结构

按照这样的方式,当需要引入一个类的时候直接调用Ext.require()方法即可,这样在使用的时候就会动态去加载这个类,当然也可以动态的去引入一个不是类的js文件,调用Ext.loadJs()即可实现动态加载,现在下面给出动态加载js实现的代码,在这里采用ajax去请求js文件,然而ajax的方式都是异步的,这样就不能保证需要使用的类还没加载完就执行后面的代码,于是先实现一个同步的ajax方法,代码如下:

	/**
	 * 扩张Ext.Ajax对象,增加同步请求方法
	 */
	Ext.apply(Ext.Ajax, {
				/**
				 * 同步请求方法,将阻塞
				 */
				syncRequest : function(cfg) {
					cfg = Ext.apply({
								success : Ext.emptyFn,
								failure : Ext.emptyFn
							}, cfg)
					var obj;
					if (window.ActiveXObject) {
						obj = new ActiveXObject('Microsoft.XMLHTTP');
					} else if (window.XMLHttpRequest) {
						obj = new XMLHttpRequest();
					}
					obj.open('POST', cfg.url, false);
					obj.setRequestHeader('Content-Type',
							'application/x-www-form-urlencoded');
					obj.send(cfg.params);
					var argument = cfg.argument || {};
					if (obj.status == 200) {
						cfg.success.call(cfg.scope || this, obj,argument);
					} else if(obj.status == 404){
//						Ext.MessageBox.alert(cfg.url+"不存在!")
						cfg.failure.call(cfg.scope || this, obj,argument);
					}else {
						cfg.failure.call(cfg.scope || this, obj,argument);
					}
					// var result = Ext.util.JSON.decode(obj.responseText);
				}
			});

 有了此同步请求方法后,下面的js动态加载管理器就很容易实现,当加载一次的js文件就不会再加载,代码:

	/**
	 * js加载管理器
	 */
	Ext.JsMgr = Ext.extend(Object, {
				timeout : 30,
				scripts : {},
				disableCaching : true,
				paths : {},
				setPath : function(dest, target) {
					this.paths[dest] = target;
				},
				loadClass : function(className) {
					for (var p in this.paths) {
						className = className.replace(p, this.paths[p])
					}
					var jsUrl = className.split(".").join("/") + ".js";
					if (!this.scripts[className]) {
						//同步请求js文件
						Ext.Ajax.syncRequest({
									url : jsUrl,
									success : this.processSuccess,
									failure : this.processFailure,
									scope : this,
									timeout : (this.timeout * 1000),
									disableCaching : this.disableCaching,
									argument : {
										'url' : className
									}
								});
					}
				},
				loadJavaScript : function(filepath) {
					var className  = filepath.replace(".js","").split("/").join(".");
					this.loadClass(className);
				},
				processSuccess : function(response,argument) {
					this.scripts[argument.url] = true;
					window.execScript ? window
							.execScript(response.responseText) : window
							.eval(response.responseText);
				},
				processFailure : function() {
				}
			})
	Ext.JsMgr = new Ext.JsMgr();
	
	Ext.setPath = function(ns,path) {
		Ext.JsMgr.setPath(ns,path) ;
	}
	Ext.require = function() {
		Ext.JsMgr.loadClass(arguments[0]);
	};
	Ext.loadJs = function() {
		Ext.JsMgr.loadJavaScript(arguments[0])
	}

 到此js加载管理器实现完成,目前只是先随便写了个哉项目中使用了下,还比较方便,不再需要大量的引入js,这样就可以实现按需加载,只是目前采用同步加载方式效率不会太高,以后考虑改成异步加载,提高加载速度。最后给出完整代码:

(function() {
	/**
	 * 扩张Ext.Ajax对象,增加同步请求方法
	 */
	Ext.apply(Ext.Ajax, {
				/**
				 * 同步请求方法,将阻塞
				 */
				syncRequest : function(cfg) {
					cfg = Ext.apply({
								success : Ext.emptyFn,
								failure : Ext.emptyFn
							}, cfg)
					var obj;
					if (window.ActiveXObject) {
						obj = new ActiveXObject('Microsoft.XMLHTTP');
					} else if (window.XMLHttpRequest) {
						obj = new XMLHttpRequest();
					}
					obj.open('POST', cfg.url, false);
					obj.setRequestHeader('Content-Type',
							'application/x-www-form-urlencoded');
					obj.send(cfg.params);
					var argument = cfg.argument || {};
					if (obj.status == 200) {
						cfg.success.call(cfg.scope || this, obj,argument);
					} else if(obj.status == 404){
//						Ext.MessageBox.alert(cfg.url+"不存在!")
						cfg.failure.call(cfg.scope || this, obj,argument);
					}else {
						cfg.failure.call(cfg.scope || this, obj,argument);
					}
					// var result = Ext.util.JSON.decode(obj.responseText);
				}
			});
	Ext.override(Ext.mgr.CompMgr,{
		getInstance : function(id, override){
			var instance, comp = this.get(id);
			if(comp){
				Ext.require(comp.className);//先加载类
				instance = new (comp.getClass())(Ext.apply(comp.getConfig(), override));
			}
			return instance;
		}
	})
	/**
	 * js加载管理器
	 */
	Ext.JsMgr = Ext.extend(Object, {
				timeout : 30,
				scripts : {},
				disableCaching : true,
				paths : {},
				setPath : function(dest, target) {
					this.paths[dest] = target;
				},
				loadClass : function(className) {
					for (var p in this.paths) {
						className = className.replace(p, this.paths[p])
					}
					var jsUrl = className.split(".").join("/") + ".js";
					if (!this.scripts[className]) {
						//同步请求js文件
						Ext.Ajax.syncRequest({
									url : jsUrl,
									success : this.processSuccess,
									failure : this.processFailure,
									scope : this,
									timeout : (this.timeout * 1000),
									disableCaching : this.disableCaching,
									argument : {
										'url' : className
									}
								});
					}
				},
				loadJavaScript : function(filepath) {
					var className  = filepath.replace(".js","").split("/").join(".");
					this.loadClass(className);
				},
				processSuccess : function(response,argument) {
					this.scripts[argument.url] = true;
					window.execScript ? window
							.execScript(response.responseText) : window
							.eval(response.responseText);
				},
				processFailure : function() {
				}
			})
	Ext.JsMgr = new Ext.JsMgr();
	
	Ext.setPath = function(ns,path) {
		Ext.JsMgr.setPath(ns,path) ;
	}
	Ext.require = function() {
		Ext.JsMgr.loadClass(arguments[0]);
	};
	Ext.loadJs = function() {
		Ext.JsMgr.loadJavaScript(arguments[0])
	}
})();

 源码下载地址:http://download.csdn.net/detail/ybhanxiao/7804811

  • 大小: 37.6 KB
分享到:
评论

相关推荐

    extjs4.0 实现了主页面框架 动态菜单 例子 表单 ajax

    extjs4.0 实现了主页面框架(主框架使用Ext.Viewport,banner使用Ext.panel.Panel,通过toolbar来放置按钮),包括左侧动态菜单实现(采用Ext.tree.Panel)动态从数据库加载数据来显示菜单(后台代码也在了通过json...

    ExtJS4中文教程2 开发笔记 chm

    ExtJS 4中动态加载的路径设置 Extjs4 API文档阅读(一)——类系统(Class System) Extjs4 API文档阅读(三)——布局和容器 Extjs4 API文档阅读(二)——MVC构架(上) Extjs4 API文档阅读(二)——MVC构架(下) Extjs4...

    动态树的管理程序(基于jQuery Treeview实现)

    在实现的时候也会有很多的方法,例如可以用extjs,jquery treeview等一些js开发包。 但是在开发的时候我种想找个例子来参考下,发现有很多这样的例子,包括extjs和jquery treeview的官方也有,但结合java后台实现的...

    ExtJS(ajax框架) 4.2.1

    类系统:作为Extjs 4架构更新的一部分,引用了一个功能更完整的类系统。 沙盒:在ExtJS历史上,ExjJS 4首次提供了完整的沙盒模式。从ExtJS 4开始,框架不再扩展数组或函数等原生对象,因此,与其它的框架同时加载到...

    轻松搞定Extjs_原创

    这是我花费数月写的关于Extjs的原创教程,共29个章节。下面是目录: 目 录 1 第一章:序 6 第二章:准备与资源 9 一、下载 9 二、拦路虎 9 三、布署环境 11 四、SpketIDE 12 五、资源 16 六、小结 16 第三章:Ext ...

    精通JS脚本之ExtJS框架.part2.rar

    本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计进度条、设计工具栏和菜单栏、设计面板、设计表格、设计表单、设计数据表、...

    ExtJSWeb应用程序开发指南(第2版)

    3.1.2 ExtJS组件配置方式介绍 3.2 信息提示框组件介绍 3.2.1 认识Ext.window.MessageBox 3.2.2 Ext.MessageBox.alert() 3.2.3 Ext.MessageBox.confirm() 3.2.4 Ext.MessageBox.prompt() 3.2.5 Ext....

    精通JS脚本之ExtJS框架.part1.rar

    本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计进度条、设计工具栏和菜单栏、设计面板、设计表格、设计表单、设计数据表、...

    ExtJs4_笔记.docx

    一、基本按钮,三种方式实现按钮事件 40 二、带图标菜单 41 三、带分割线的按钮 43 四、菜单式按钮 44 四、按钮组合 45 第六章 Ext.MessageBox 消息对话框 46 一、警告对话框和确认对话框 46 二、输入对话框 47 三、...

    ext JS API 实战

    ExtJS由一系列的类库组成,一旦页面成功加载了ExtJS库后,我们就可以在页面中通过javascript调用ExtJS的类及控件来实现需要的功能。ExtJS的类库由以下几部分组成: 底层API(core):底层API中提供了对DOM操作、查询...

    extjs3.0+struts2源码

    extjs3.0+struts2 实现登陆 验证码 tree树的加载 首页面。 主要代码还是借鉴别人,然后我再原有基础上再加工。 还没添加数据库类。对于初学者来说还是不错的入门源码。

    ExtJS 2.0实用简明教程 之Ext类库简介

    ExtJS由一系列的类库组成,一旦页面成功加载了ExtJS库后,我们就可以在页面中通过javascript调用ExtJS的类及控件来实现需要的功能。

    Ext Js权威指南(.zip.001

    4.4.4 实现动态加载:ext.loader / 151 4.4.5 管理类的类:ext.classmanager / 159 4.4.6 类创建的总结 / 161 4.5 动态加载的路径设置 / 163 4.6 综合实例:页面计算器 / 165 4.7 本章小结 / 169 第5章 ext ...

    RapidWebDev框架源码

    通过ExtJS实现UI的动态输出,它提供了最佳的用户体验以及可靠性. 通过Linq-To-SQL进行数据访问,我们计划在ADO.NET Entity Framework成熟以后进行迁移. Restful web service. 通过NBehavior实现行为驱动. ...

    信息管理系统开发MVC框架源码

    4、系统功能定义:定义系统功能,动态加载系统功能。 5、角色权限分配:分配各角色所涉及的功能。 6、用户角色分配:维护相关用户的使用角色。 7、登录日志维护:维护并查看用户日志。 8、参数分类维护:维护...

    ExtAspNet_v2.3.2_dll

    ExtAspNet - ExtJS based ASP.NET Controls with Full AJAX Support ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有ViewState,没有JavaScript,没有CSS,没有...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -这样所有需要占据全屏的Panel(不管你是Accordion,Panel,ContentPanel,Form,GroupPanel,SimpleForm,Tree还是Grid,TabStrip)都可以通过这种方式全屏。 -简单方便,示例可以参考 default.aspx 或者 other\...

Global site tag (gtag.js) - Google Analytics