关于实现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文件目录结构如下:

按照这样的方式,当需要引入一个类的时候直接调用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
关于实现Extjs动态加载类的方式实现的更多相关文章
- tomcat 5.5 动态加载类
转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735 开发使用的是tomcat5.5. ...
- [javaSE] 反射-动态加载类
Class.forName(“类的全称”) ①不仅表示了类的类类型,还代表了动态加载类 ②请大家区分编译,运行 ③编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 Ⅰ所有的new对象都是静态加载 ...
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
- Java动态加载类在功能模块开发中的作用
Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...
- java reflect 初始学习 动态加载类
首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...
- Java运行时动态加载类之ClassLoader
https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Class类动态加载类的用法
编译时刻加载类出现的问题:一个功能有错,所有功能都用不了 动态加载类:
随机推荐
- logback笔记
logback的使用 logback是什么? Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和l ...
- [HTML]安卓下<video>无法点击播放
在<video>外面添加<div>并加上data-tap-disabled="true"属性即可
- EUI ToggleButton ToggleSwitch 实现类似音乐开关按钮
一 ToggleButton和ToggleSwitch区别 没区别,就是继承... export class ToggleSwitch extends ToggleButton { /** * @la ...
- mapreduce出现类似死锁情况
在往hbase表里通过bulkload导数据时,某个mapreduce跑了一个多小时还没跑,看yarn界面,发现map还有一小部分没跑完,没跑完的map全在pending,running中没有,同时r ...
- maven安装配置
1.到官网下载maven http://maven.apache.org/download.html 2.解压后解压到任意文件路径 本地解压的位置:C:\soft\apache-maven-3.3.9 ...
- C#算法之判断一个字符串是否是对称字符串
记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...
- Python语法一
前记,今天开始学习Python 参考 笨方法学习+Python(第三版) 因为有编程基础,所以入门不难,相比于以前学过的其它语言编程,Python当然也有它独特的语法格式. 1.安装Python 访问 ...
- SOA架构介绍和理解
SOA架构介绍和理解 SOA的正确方法论及目标模型,其实SOA在实现架构落地上,需要考虑到对服务的组合,不断的重用现有的服务,让企业应用可以逐步集成,快速实现业务的迭代. 通过SOA架构分层将服务按照 ...
- UVALive - 4513 Stammering Aliens ——(hash+二分 || 后缀数组加二分)
题意:找一个出现了m次的最长子串,以及这时的最右的位置. hash的话代码还是比较好写的,,但是时间比SA多很多.. #include <stdio.h> #include <alg ...
- Apache伪静态在网站目录没有反斜杠后自动添加反斜杠
第一步:确认网站开启REWRITE规则 一般有两种情况: i.apache安装的时候已经包含rewrite功能 ii.后续配置的时候新添加mod_rewrite.so.这种情况需要在httpd.con ...