通过分析源代码解决动态加载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的问题的更多相关文章

  1. [AngularJS] 使用AngularAMD动态加载Controller

    [AngularJS] 使用AngularAMD动态加载Controller 前言 使用AngularJS来开发Single Page Application(SPA)的时候,可以选用AngularU ...

  2. swiper 解决动态加载数据滑动失效的问题

    两种解决方法 第一种解决办法: success:function(result){ var resultdata =eval("("+result+")"); ...

  3. ExtJs中动态加载机制研究(转)

    觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659 昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果 ...

  4. Python3 网络爬虫:漫画下载,动态加载、反爬虫这都不叫事

    一.前言 作者:Jack Cui 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...

  5. js 动态加载事件的几种方法总结

    本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助   有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添 ...

  6. [AngularJS] 使用AngularCSS动态加载CSS

    [AngularJS] 使用AngularCSS动态加载CSS 前言 使用AngularAMD动态加载Controller 使用AngularAMD动态加载Service 上列两篇文章里,介绍了如何如 ...

  7. [AngularJS] 使用AngularAMD动态加载Service

    [AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...

  8. ExtJs 4.2.1 复选框数据项动态加载(更新一下)

    最近在做博客项目,后台管理用的是ExtJs4.2.1版本,因为是初学所以在使用的时候也遇到不少的这样或那样的问题,也写了不少这方面的博客,今天要写的博客是关于复选框数据项动态的加载功能,以前也没用过, ...

  9. ExtJS 4.1 TabPanel动态加载页面并执行脚本【转】

    ExtJS 4.1 TabPanel动态加载页面并执行脚本 按照官方示例,可以动态加载页面,可是脚本不执行,于是查SDK.google,发现scripts需要设置为true,于是设置该属性,整个代码如 ...

随机推荐

  1. HDUOJ --2523

     http://acm.hdu.edu.cn/showproblem.php?pid=2523 哈希表..球阀 代码: #include<iostream> #include<vec ...

  2. 使用Promise

    Promise所要解决的问题:回调地狱 asyncTask1(data, function (data1){ asyncTask2(data1, function (data2){ asyncTask ...

  3. PHP5.3新特性

    1.首先对之前滥用的语法进行了规范 众所周知PHP在语言开发过程中有一个很好的容错性,导致在数组或全局变量中包含字符串不使用引号是可以不报错的,很多业余的开发者因为懒惰而产生的安全问题十分严重,之所以 ...

  4. 正确关闭Redis

    1.首先关闭单机版 我的单机版 是放在redis文件夹下面的 首先你要启动你的单机版redis 直接shutdown quit 退出去 ps aux|grep redis  查看运行的redis 关闭 ...

  5. FA_资产成批调整(流程)

    2014-06-08 Created By BaoXinjian

  6. Linux内核(3) - 分析内核源码如何入手(下)

    下面的分析,米卢教练说了,内容不重要,重要的是态度.就像韩局长对待日记的态度那样,严谨而细致. 只要你使用这样的态度开始分析内核,那么无论你选择内核的哪个部分作为切入点,比如USB,比如进程管理,在花 ...

  7. STM32F103 AFIO时钟疑问

    在stm32F103系列中:AFIO是重映射辅助时钟,如果仅仅是使用第二功能(如uart,spi,),不需要打开,使用第二功能打开GPIO和第二功能时钟.我反复测试是这样的 AFIO时钟由RCC_AP ...

  8. struts2 ValueStack详解,页面获取值el表达式、ognl表达式

    http://www.blogjava.net/max/archive/2007/04/28/114417.html 我想用的是el表达式! http://www.cnblogs.com/belief ...

  9. 机器学习 Top 20 Python 开源项目

    转自:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565022&idx=1&sn=9aa035097120 ...

  10. A simple case to use Celery:

    Prerequisites:   1: Install RabbitMQ as it would be used as message broker for Celery. In windows, i ...