ExtJs 通过分析源代码解决动态加载Controller的问题
通过分析源代码解决动态加载Controller的问题
最近在研究ExtJs(4.2.0)的MVC开发模式,具体Extjs的MVC如何使用这里不解释,具体参见ExtJs的官方文档。这里要解决的问题是如何解决在使用MVC模式时动态加载Controller。
这是正常的写法,在Application里配置Controller
Application
Ext.application({
... controllers: [
'Users'
], ...
});
Controller
Ext.define('AM.controller.Users', {
extend: 'Ext.app.Controller', stores: [
'Users@AM.store'
], models: [
'User@AM.model'
], views: [
'Edit@AM.view.user',
'List@AM.view.user'
], refs: [
{
ref: 'usersPanel',
selector: 'panel'
}
]
...
});
这样的话ExtJs在初始化我们的Application的时候会去加载配置的[controllers],然后Controller里又依赖了[view][store][model]。
这样的话ExtJs会动态加载这些类的JS文件.这是常规的方式,这种方式的一个问题就是 如果我们的应用程序很大,那么会在Application里配置很多的controller。那么就会导致ExtJs在第一次加载时速度非常的慢,那么如何解决这个问题呢,接下来就是我的解决办法。
首先想到的就是查看Ext.app.Application这个类的源代码 看看它是如何加载Controller的
打开源代码我们首先看它的构造函数
constructor: function(config) {
var me = this; //<debug>
if (Ext.isEmpty(me.name)) {
Ext.Error.raise("[Ext.app.Application] Name property is required");
}
//</debug>
me.callParent(arguments);
//调用继承至Ext.app.Controller的方法 设置初始化状态
me.doInit(me);
//初始化命名空间
me.initNamespace(); //这个方法是核心方法 由它来初始化controller的 那么我们看看这个方法到底做了什么
me.initControllers(); //初始化后调用一些事件(不重要)
me.onBeforeLaunch();
me.finishInitControllers();
}
initControllers: function() {
var me = this,
controllers = Ext.Array.from(me.controllers); me.controllers = new Ext.util.MixedCollection(); for (var i = 0, ln = controllers.length; i < ln; i++) {
me.getController(controllers[i]);
}
}
下面来解释一下initControllers方法
controllers: [
'Users'
],
1 拿到配置的 controllers(在application中定义地的) 并转换成数组
controllers = Ext.Array.from(me.controllers); 2 设置me.controllers = new Ext.util.MixedCollection();(类似于java的HashMap key value形式)
me.controllers = new Ext.util.MixedCollection();
3 循环controllers 调用了application的getController('你配置的controller')方法,并把每一个controller传过去.那么这里就是('Users')
for (var i = 0, ln = controllers.length; i < ln; i++) {
me.getController(controllers[i]);
} 其实本文的重点就是Application.getController(name)方法
getController: function(name) {
var me = this,
controllers = me.controllers,
className, controller; controller = controllers.get(name); if (!controller) {
className = me.getModuleClassName(name, 'controller'); controller = Ext.create(className, {
application: me,
id: name
}); controllers.add(controller); if (me._initialized) {
controller.doInit(me);
}
} return controller;
},
这里就可以根据每个Controller进行加载了,加载完毕以后会调用doInit方法对Controller进行初始化
if (me._initialized) {
controller.doInit(me);
}
看到这里已经明白了Application加载Controller的原理,那么我们就可以根据需要进行动态加载了
MyApplication.getController("Users")
ExtJs 通过分析源代码解决动态加载Controller的问题的更多相关文章
- [AngularJS] 使用AngularAMD动态加载Controller
[AngularJS] 使用AngularAMD动态加载Controller 前言 使用AngularJS来开发Single Page Application(SPA)的时候,可以选用AngularU ...
- swiper 解决动态加载数据滑动失效的问题
两种解决方法 第一种解决办法: success:function(result){ var resultdata =eval("("+result+")"); ...
- ExtJs中动态加载机制研究(转)
觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659 昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果 ...
- Python3 网络爬虫:漫画下载,动态加载、反爬虫这都不叫事
一.前言 作者:Jack Cui 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...
- js 动态加载事件的几种方法总结
本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添 ...
- [AngularJS] 使用AngularCSS动态加载CSS
[AngularJS] 使用AngularCSS动态加载CSS 前言 使用AngularAMD动态加载Controller 使用AngularAMD动态加载Service 上列两篇文章里,介绍了如何如 ...
- [AngularJS] 使用AngularAMD动态加载Service
[AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...
- ExtJs 4.2.1 复选框数据项动态加载(更新一下)
最近在做博客项目,后台管理用的是ExtJs4.2.1版本,因为是初学所以在使用的时候也遇到不少的这样或那样的问题,也写了不少这方面的博客,今天要写的博客是关于复选框数据项动态的加载功能,以前也没用过, ...
- ExtJS 4.1 TabPanel动态加载页面并执行脚本【转】
ExtJS 4.1 TabPanel动态加载页面并执行脚本 按照官方示例,可以动态加载页面,可是脚本不执行,于是查SDK.google,发现scripts需要设置为true,于是设置该属性,整个代码如 ...
随机推荐
- HDUOJ --2523
http://acm.hdu.edu.cn/showproblem.php?pid=2523 哈希表..球阀 代码: #include<iostream> #include<vec ...
- 使用Promise
Promise所要解决的问题:回调地狱 asyncTask1(data, function (data1){ asyncTask2(data1, function (data2){ asyncTask ...
- PHP5.3新特性
1.首先对之前滥用的语法进行了规范 众所周知PHP在语言开发过程中有一个很好的容错性,导致在数组或全局变量中包含字符串不使用引号是可以不报错的,很多业余的开发者因为懒惰而产生的安全问题十分严重,之所以 ...
- 正确关闭Redis
1.首先关闭单机版 我的单机版 是放在redis文件夹下面的 首先你要启动你的单机版redis 直接shutdown quit 退出去 ps aux|grep redis 查看运行的redis 关闭 ...
- FA_资产成批调整(流程)
2014-06-08 Created By BaoXinjian
- Linux内核(3) - 分析内核源码如何入手(下)
下面的分析,米卢教练说了,内容不重要,重要的是态度.就像韩局长对待日记的态度那样,严谨而细致. 只要你使用这样的态度开始分析内核,那么无论你选择内核的哪个部分作为切入点,比如USB,比如进程管理,在花 ...
- STM32F103 AFIO时钟疑问
在stm32F103系列中:AFIO是重映射辅助时钟,如果仅仅是使用第二功能(如uart,spi,),不需要打开,使用第二功能打开GPIO和第二功能时钟.我反复测试是这样的 AFIO时钟由RCC_AP ...
- struts2 ValueStack详解,页面获取值el表达式、ognl表达式
http://www.blogjava.net/max/archive/2007/04/28/114417.html 我想用的是el表达式! http://www.cnblogs.com/belief ...
- 机器学习 Top 20 Python 开源项目
转自:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565022&idx=1&sn=9aa035097120 ...
- A simple case to use Celery:
Prerequisites: 1: Install RabbitMQ as it would be used as message broker for Celery. In windows, i ...