zoukankan      html  css  js  c++  java
  • 关于实现Extjs动态加载类的方式实现

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

    Java代码  收藏代码
    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.   
    6. Ext.require("ThinkOA.Viewport");//导入自定义类ThinkOA.Viewport 需要保证app目录下有名称为Viewprot.js文件,里面的类名称必须是ThinkOA.Viewport  
    7. Ext.require("ThinkOA.LoginWindow");//导入自定义类ThinkOA.LoginWindow  
    8. new ThinkOA.LoginWindow({  
    9.     isDebug: false,  
    10.     loginUrl: "login.do",//Ext.ParamMgr.getValue("login.url"),  
    11.       
    12.     listeners: {  
    13.         scope: this,  
    14.         submit: function(win, jsonObject) {  
    15.             if (jsonObject.success) {  
    16.                 new ThinkOA.Viewport({  
    17.                 });  
    18.                 win.close();  
    19.             }else {  
    20.                 Ext.MessageBox.alert("提示",jsonObject.message);  
    21.             }   
    22.         }  
    23.     }  
    24.   
    25. }).show();  

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

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

    Js代码  收藏代码
    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文件就不会再加载,代码:

    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.   
    47. Ext.setPath = function(ns,path) {  
    48.     Ext.JsMgr.setPath(ns,path) ;  
    49. }  
    50. Ext.require = function() {  
    51.     Ext.JsMgr.loadClass(arguments[0]);  
    52. };  
    53. Ext.loadJs = function() {  
    54.     Ext.JsMgr.loadJavaScript(arguments[0])  
    55. }  

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

    Java代码  收藏代码
    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.       
    92.     Ext.setPath = function(ns,path) {  
    93.         Ext.JsMgr.setPath(ns,path) ;  
    94.     }  
    95.     Ext.require = function() {  
    96.         Ext.JsMgr.loadClass(arguments[0]);  
    97.     };  
    98.     Ext.loadJs = function() {  
    99.         Ext.JsMgr.loadJavaScript(arguments[0])  
    100.     }  
    101. })();  

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

  • 相关阅读:
    解决Chrome 70及以上版本的证书问题:Failed to load resource: net::ERR_CERT_SYMANTEC_LEGACY
    VUE使用axios数据请求时报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法
    生辰八字推算
    OneNote巧妙设置标题
    Kibana安装与介绍
    Logstash入门简介
    Metricbeat入门简介
    FileBeats入门简介
    ElasticSearch集群部署
    ElasticSearch安装与介绍
  • 原文地址:https://www.cnblogs.com/liuyandeng/p/5824035.html
Copyright © 2011-2022 走看看