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

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

js文件目录结构如下:

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

  1. /**
  2. * 扩张Ext.Ajax对象,增加同步请求方法
  3. */
  4. Ext.apply(Ext.Ajax, {
  5. /**
  6. * 同步请求方法,将阻塞
  7. */
  8. syncRequest : function(cfg) {
  9. cfg = Ext.apply({
  10. success : Ext.emptyFn,
  11. failure : Ext.emptyFn
  12. }, cfg)
  13. var obj;
  14. if (window.ActiveXObject) {
  15. obj = new ActiveXObject('Microsoft.XMLHTTP');
  16. } else if (window.XMLHttpRequest) {
  17. obj = new XMLHttpRequest();
  18. }
  19. obj.open('POST', cfg.url, false);
  20. obj.setRequestHeader('Content-Type',
  21. 'application/x-www-form-urlencoded');
  22. obj.send(cfg.params);
  23. var argument = cfg.argument || {};
  24. if (obj.status == 200) {
  25. cfg.success.call(cfg.scope || this, obj,argument);
  26. } else if(obj.status == 404){
  27. //                      Ext.MessageBox.alert(cfg.url+"不存在!")
  28. cfg.failure.call(cfg.scope || this, obj,argument);
  29. }else {
  30. cfg.failure.call(cfg.scope || this, obj,argument);
  31. }
  32. // var result = Ext.util.JSON.decode(obj.responseText);
  33. }
  34. });

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

  1. /**
  2. * js加载管理器
  3. */
  4. Ext.JsMgr = Ext.extend(Object, {
  5. timeout : 30,
  6. scripts : {},
  7. disableCaching : true,
  8. paths : {},
  9. setPath : function(dest, target) {
  10. this.paths[dest] = target;
  11. },
  12. loadClass : function(className) {
  13. for (var p in this.paths) {
  14. className = className.replace(p, this.paths[p])
  15. }
  16. var jsUrl = className.split(".").join("/") + ".js";
  17. if (!this.scripts[className]) {
  18. //同步请求js文件
  19. Ext.Ajax.syncRequest({
  20. url : jsUrl,
  21. success : this.processSuccess,
  22. failure : this.processFailure,
  23. scope : this,
  24. timeout : (this.timeout * 1000),
  25. disableCaching : this.disableCaching,
  26. argument : {
  27. 'url' : className
  28. }
  29. });
  30. }
  31. },
  32. loadJavaScript : function(filepath) {
  33. var className  = filepath.replace(".js","").split("/").join(".");
  34. this.loadClass(className);
  35. },
  36. processSuccess : function(response,argument) {
  37. this.scripts[argument.url] = true;
  38. window.execScript ? window
  39. .execScript(response.responseText) : window
  40. .eval(response.responseText);
  41. },
  42. processFailure : function() {
  43. }
  44. })
  45. Ext.JsMgr = new Ext.JsMgr();
  46. Ext.setPath = function(ns,path) {
  47. Ext.JsMgr.setPath(ns,path) ;
  48. }
  49. Ext.require = function() {
  50. Ext.JsMgr.loadClass(arguments[0]);
  51. };
  52. Ext.loadJs = function() {
  53. Ext.JsMgr.loadJavaScript(arguments[0])
  54. }

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

  1. (function() {
  2. /**
  3. * 扩张Ext.Ajax对象,增加同步请求方法
  4. */
  5. Ext.apply(Ext.Ajax, {
  6. /**
  7. * 同步请求方法,将阻塞
  8. */
  9. syncRequest : function(cfg) {
  10. cfg = Ext.apply({
  11. success : Ext.emptyFn,
  12. failure : Ext.emptyFn
  13. }, cfg)
  14. var obj;
  15. if (window.ActiveXObject) {
  16. obj = new ActiveXObject('Microsoft.XMLHTTP');
  17. } else if (window.XMLHttpRequest) {
  18. obj = new XMLHttpRequest();
  19. }
  20. obj.open('POST', cfg.url, false);
  21. obj.setRequestHeader('Content-Type',
  22. 'application/x-www-form-urlencoded');
  23. obj.send(cfg.params);
  24. var argument = cfg.argument || {};
  25. if (obj.status == 200) {
  26. cfg.success.call(cfg.scope || this, obj,argument);
  27. } else if(obj.status == 404){
  28. //                      Ext.MessageBox.alert(cfg.url+"不存在!")
  29. cfg.failure.call(cfg.scope || this, obj,argument);
  30. }else {
  31. cfg.failure.call(cfg.scope || this, obj,argument);
  32. }
  33. // var result = Ext.util.JSON.decode(obj.responseText);
  34. }
  35. });
  36. Ext.override(Ext.mgr.CompMgr,{
  37. getInstance : function(id, override){
  38. var instance, comp = this.get(id);
  39. if(comp){
  40. Ext.require(comp.className);//先加载类
  41. instance = new (comp.getClass())(Ext.apply(comp.getConfig(), override));
  42. }
  43. return instance;
  44. }
  45. })
  46. /**
  47. * js加载管理器
  48. */
  49. Ext.JsMgr = Ext.extend(Object, {
  50. timeout : 30,
  51. scripts : {},
  52. disableCaching : true,
  53. paths : {},
  54. setPath : function(dest, target) {
  55. this.paths[dest] = target;
  56. },
  57. loadClass : function(className) {
  58. for (var p in this.paths) {
  59. className = className.replace(p, this.paths[p])
  60. }
  61. var jsUrl = className.split(".").join("/") + ".js";
  62. if (!this.scripts[className]) {
  63. //同步请求js文件
  64. Ext.Ajax.syncRequest({
  65. url : jsUrl,
  66. success : this.processSuccess,
  67. failure : this.processFailure,
  68. scope : this,
  69. timeout : (this.timeout * 1000),
  70. disableCaching : this.disableCaching,
  71. argument : {
  72. 'url' : className
  73. }
  74. });
  75. }
  76. },
  77. loadJavaScript : function(filepath) {
  78. var className  = filepath.replace(".js","").split("/").join(".");
  79. this.loadClass(className);
  80. },
  81. processSuccess : function(response,argument) {
  82. this.scripts[argument.url] = true;
  83. window.execScript ? window
  84. .execScript(response.responseText) : window
  85. .eval(response.responseText);
  86. },
  87. processFailure : function() {
  88. }
  89. })
  90. Ext.JsMgr = new Ext.JsMgr();
  91. Ext.setPath = function(ns,path) {
  92. Ext.JsMgr.setPath(ns,path) ;
  93. }
  94. Ext.require = function() {
  95. Ext.JsMgr.loadClass(arguments[0]);
  96. };
  97. Ext.loadJs = function() {
  98. Ext.JsMgr.loadJavaScript(arguments[0])
  99. }
  100. })();

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

关于实现Extjs动态加载类的方式实现的更多相关文章

  1. tomcat 5.5 动态加载类

    转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735 开发使用的是tomcat5.5. ...

  2. [javaSE] 反射-动态加载类

    Class.forName(“类的全称”) ①不仅表示了类的类类型,还代表了动态加载类 ②请大家区分编译,运行 ③编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 Ⅰ所有的new对象都是静态加载 ...

  3. java动态加载类和静态加载类笔记

    JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...

  4. Java动态加载类在功能模块开发中的作用

    Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...

  5. java reflect 初始学习 动态加载类

    首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...

  6. Java运行时动态加载类之ClassLoader

    https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...

  7. java反射动态加载类Class.forName();

    1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...

  8. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  9. Class类动态加载类的用法

    编译时刻加载类出现的问题:一个功能有错,所有功能都用不了 动态加载类:

随机推荐

  1. 解析json

    String json = "{\"elements\":[{\"distance\":{\"text\":\"1364 ...

  2. thinkPHP--CURD操作

    1.数据创建 2.数据写入 3.数据读取 4.数据更新 5.数据删除 一.数据创建 在数据库添加等操作之前,我们首先需要对数据进行创建.何为数据创建,就是接受提 交过来的数据,比如表单提交的 POST ...

  3. disconf系列【1】——百度disconf在ubuntu14.04环境下的安装

    disconf官网给出的安装文档默认读者已经非常熟练本文1.2章节给出的依赖软件的原理及使用方法,且官网默认安装环境为linux(windows安装方法只字未提).同时,官网对很多重要的细节语焉不详, ...

  4. Druid监控Mybatis不显示SQL问题

    一.Web.xml增加如下配置: 1.DruidWebStatFilter.如果没有配置filter信息.session监控,web监控等不可用.没有配置 <filter> <fil ...

  5. AIX 环境下整理文件系统碎块

    IBM AIX v5.3以上版本操作系统环境下基本上不需要对文件系统碎块进行整理,查到AIX里有整理文件系统碎块命令,这里简单提一下. 命令:defragfs例:#defragfs /var defr ...

  6. 9.1 js基础总结2

    3.布尔类型(Boolean) 布尔型数据只有true和false两个值,与字符串不同,不要把布尔值用引号括起来,布尔值false与字符串“false”是两回事. var married = true ...

  7. sqlite数据库安装配置

    一.SQLite简介    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中, ...

  8. 使用UltraISO制作U盘启动盘——转载

    现在流行用U盘来安装系统,但要用U盘来安装系统的前提条件下是如何将镜像文件写入到U盘里,UltraISO能很好的满足你的需求. 步骤/方法  鼠标右键“以管理员身份运行”UltraISO图标    打 ...

  9. ViewPager如下效果你研究过吗?

    1:ViewPager实现欢迎页面动画效果 ViewPager实现欢迎页面动画滑动切换view效果,页面切换添加优美的动画, //主要代码实现 public void animateSecondScr ...

  10. MySQL大数据量快速分页实现(转载)

    在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢?     般刚开始学SQL语句的时候,会这 ...