ExtJs中动态加载机制研究(转)
觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659
昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果。
以service registry portlet为例:
比如,在 liferay-portlet.xml中定义了:

所以我们的js的入口点是app.js,这其中创建了Ext.application并且声明了动态加载controller:
1.Ext.application({
2.name: 'serviceRegistry',
3.appFolder: '/serviceregistryportlet/js/app',
4.controllers:['mainPanel'],
5.launch:function(){
6....
7.)
我们这里具体看extjs是如何实现动态加载controller的。
首先我们可以看到,当它在加载controller时候,所有这里声明的controller的都会以类全名的形式传递给classNames属性

Ext.Loader的config选项paths会收到2个属性,一个是默认的Ext的path,它的默认值定义如下:
01.config: {
02.
03.enabled: false,
04.
05.disableCaching: true,
06.
07.disableCachingParam: '_dc',
08.
09.paths: {
10.'Ext': '.'
11.}
12.},
另外一个就是从Ext.application中获取的属性,它的key 为Ext.application中定义的name(在这里是serviceRegistry),
value为Ext.application中定义的appFolder(在这里是/serviceregistryportlet/js/app)
如下图所示:

然后在第5314行,就通过另外一个方法getPrefix()来根据controller的类名来获取它的前缀,并且这个前缀会最终参与到运算。我们这里省去这段逻辑,反正最终,这个"serviceRegistry.controller.mainPanel'的前缀是"serviceRegistry",如上图的调试结果。
注:以上的所有结论和我昨天猜想的完全一致,昨天并没有调试结论,看来我计算机感觉不错,小得意一下~
既然上面paths给出了2个候选的路径名(一个是Ext级别的,一个是项目serviceRegistry级别的),这2个路径名都有可能作为最终加载资源文件的备选路径,那么选取哪一个路径作为最终加载路径呢?就要看下面的分析了。
刚才因为已经得到了prefix=serviceRegistry,所以我们通过第5321行: path=paths[prefix] 来最终得到了真正要加载的路径名,也就是"/serviceregistryportlet/js/app"
紧接着,class的名字也确定下来了,就是类的全名(classFullName)去除掉前缀(prefix),所以也就是"serviceRegistry.controller.mainPanel",去除掉"serviceRegistry",剩下来"controller.mainPanel":
以上2个信息都可以从调试的结果看出来;

所以最后工作就很清楚了,它会吧所有的路径名中的"."替换成"/" ,然后最后结尾加上".js"文件扩展名,所以最终就成了js controller文件的资源路径:

这个路径是正确的而且是我们预期的。。
所以从以上调试,我们可以总结出以下结论:
(1)对于controller而言,它的加载路径总是有2个备选路径,一个是Ext框架级别的备选路径,它的默认值是当前目录".",另外一个是项目级别的路径,并且项目级别的路径的优先级高于框架级别。只有项目级别路径加载不到js资源文件才会从框架级别的路径中加载js文件。
(2)对于controller而言,要计算出项目级别的路径,不得不获取很多相关信息,比如说前缀,controller的类名,路径名。其中 Ext.application的项目名(name)的作用是提供了项目级别路径的key,Ext.application的(appFolder)提供了项目级别路径的value, 前缀是通过类的全名解析出来的。
(3)一般类的全名的前缀部分最好和Ext.application的项目名(name)一致,其原因是,资源文件最终路径path是通过path=paths[prefix]计算出来的。如果不一致的话,要走else 分支。
(4)所有的资源文件最终路径都是用.分割的路径最终替换成的/分割的路径并且尾部追加扩展名来形成的,项目中任何地方不会涉及裸露的路径字符串。
(5)在任何情况下controller总能被正确的加载,只要appFolder设置正确。比如说我们把Ext.application的 name设置成"hello",吧appFolder设置为"/xxx/js/app",但是,我们某个controller文件,我们的前缀并不设置为"hello" ,而是设置成其他的,比如fxxk,所以controller的类全名是"fxxk.controller.ABCController",在这种情况下。prefix因为是从"fxxk.controller.ABCController"字符串中分析来的,所以它的值是“fxxk",而 appName因为是"hello",所以paths中有2个值,一个是key="Ext" ,value=".",另外一个是 key="hello",value="/xxx/js/app",所以执行path=paths[prefix]值时,它没办法获取任何值,所以保留原来的默认值"" 空字符串。但是,className是用"fxxk.controller.ABCController"去除prefix "fxxk",所以,className是正确的,还是"controller.ABCController",所以在最后5329行拼接path时候:path.replace(slashDotSlashre,'/')依然返回"", 而className是正确的,所以className.replace(dotRe,"/"),会返回/controller /ABCController.最后拼接上.js扩展名。所以这个文件依然能正确加载。
作者: 平行线的凝聚
原文: http://supercharles888.blog.51cto.com/609344/1244064
ExtJs中动态加载机制研究(转)的更多相关文章
- Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)
基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 个人技术博客:http://www.cnblogs.com/M ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- 在ASP.NET中动态加载内容(用户控件和模板)
在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...
- 在MVC应用程序中动态加载PartialView
原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载.为了演示与做好这个 ...
- java动态加载机制
假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象, ...
- 在VC中动态加载ODBC的方法
在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较困难的工作.而且,在实际应用中,用户往往 ...
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
- vue中动态加载img
想实现动态加载图片,当点击“首页”时,图片变色 代码如下: <mt-tabbar v-model="selected" fixed class="border-1p ...
随机推荐
- 有关Spring Batch
在使用Spring Batch时,在无法实现StepListener的情况下,如何使用ExecutionContext呢. 解决办法,使用宣言@BeforeStep或@AfterStep.
- JavaScript XML 兼容处理,序列化和反序列化以及回调事件
浏览器中XML DOM的支持 IE中通过ActiveXObject实现了XML的支持,存在一下几个版本:Microsoft.XmlDom,MSXML2.DOMDocument,MSXML2.DOMDo ...
- Codeforces 350B Resort
题目链接:http://codeforces.com/problemset/problem/350/B 一开始想复杂了,建了张图,结果效率太低T了.其实用数组存可以了,结果发现的时候快没时间了,修改好 ...
- 关于数据库一致改关闭下redo日志文件丢失的处理办法的总结
数据库一致性关闭下redo日志文件丢失的处理办法(归档和非归档都行) 1. inactive log 在一致性关闭后删除重启时可以在mount下(不丢失数据) alter database clea ...
- (转)Linux中的文件描述符
本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为 ...
- kindeditor限制html长度的问题
<html> <head> <script charset="utf-8" src="/kindeditor/kindeditor_min. ...
- 洛谷 P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 窗体控件 回车事件 分类: WinForm 2014-11-21 10:45 233人阅读 评论(0) 收藏
说明: (1)设置窗体控件的TabIndex属性,(按回车顺序设置TabIndex的大小) (2)修改窗体的一个属性:KeyPreview=true //protected override void ...
- 3proxy 二级代理配置样例
适应情况: 有时,我们的机器HOST-A只能通过代理服务器HOST-B才可以访问internet, 而与我们相连的机器HOST-C也需要访问internet, 但是HOST-C却不能直接访问HOST- ...
- 如何解决 SogouIinput not enough space for thread data ?? 虚拟内存
问题:总是提示没有足够的空间读写数据 上图: 原因: 可能是虚拟内存设置了过大了[我不知道明白是不是也是这样,我出现这个问题就是因为我把虚拟内存设置成了4G,我的物理内存是2G的] 具体问题具体分析, ...