AngularJs根据访问的页面动态加载Controller的解决方案


Posted in Javascript onFebruary 04, 2015

用Ng就是想做单页面应用(simple page application),就是希望站内所有的页面都是用Ng的Route,尽量不用location.href,但是这样的webapp好处是很多,但是美中不足的是当你的webapp随着时间的推移,用户变多,功能变得更丰富,controller也变得越来越多,你不得不把所有的controller当作全局模块进行加载,以使得在站内任何一个页面中按F5刷新后能route到任意一个其他页面,而不会发生找不到controller的错误,加载所有的controller使得在手机端上,页面的首次打开速度变慢,今天我就和大家分享我是怎么改善这个缺点的,实现Controller的模块化加载

app.js

app.config(function($controllerProvider, $compileProvider, $filterProvider, $provide) {

  app.register = {

    controller: $controllerProvider.register,

    directive: $compileProvider.directive,

    filter: $filterProvider.register,

    factory: $provide.factory,

    service: $provide.service

  };

});

在route时阻塞一下去加载需要的js,加载成功后再继续,不知道$script是什么的同学请点http://dustindiaz.com/scriptjs

$routeProvider.when('/:plugin', {

  templateUrl: function(rd) {

    return 'plugin/' + rd.plugin + '/index.html';

  },

  resolve: {

    load: function($q, $route, $rootScope) {

      var deferred = $q.defer();

      var dependencies = [

        'plugin/' + $route.current.params.plugin + '/controller.js'

      ];

      $script(dependencies, function () {

        $rootScope.$apply(function() {

          deferred.resolve();

        });

      });

      return deferred.promise;

    }

  }

});

controller.js

app.register.controller('MyPluginCtrl', function ($scope) {

  ...

});

 index.html

<div ng-controller="MyPluginCtrl">

  ...

</div>

这样改造就可以实现route时动态去加载这个route所依赖的js,但是一般我们的webapp中route都有很多,每个都要写那么一堆代码,既难看又难于维护,我们不妨再优化一下

app.js

app.config(function($controllerProvider, $compileProvider, $filterProvider, $provide) {

  app.register = {

    controller: $controllerProvider.register,

    directive: $compileProvider.directive,

    filter: $filterProvider.register,

    factory: $provide.factory,

    service: $provide.service

  };

  app.asyncjs = function (js) {

        return ["$q", "$route", "$rootScope", function ($q, $route, $rootScope) {

            var deferred = $q.defer();

            var dependencies = js;

            if (Array.isArray(dependencies)) {

                for (var i = 0; i < dependencies.length; i++) {

                    dependencies[i] += "?v=" + v;

                }

            } else {

                dependencies += "?v=" + v;//v是版本号

            }

            $script(dependencies, function () {

                $rootScope.$apply(function () {

                    deferred.resolve();

                });

            });

            return deferred.promise;

        }];

    }

});
$routeProvider.when('/:plugin', {

  templateUrl: function(rd) {

    return 'plugin/' + rd.plugin + '/index.html';

  },

  resolve: {

    load: app.asyncjs('plugin/controller.js')

  }

});

到此只要把原来一个controller.js按模块拆分成多个js然后为route添加模块依赖便可提高加载速度,这个方法不仅仅可以用在controller按需加载,而且可以用在其他js模块,例如jquery.ui.datepicker.js这样的日期选择插件,在需要日期选择插件的route节点加上

$routeProvider.when('/:plugin', {

  templateUrl: function(rd) {

    return 'plugin/' + rd.plugin + '/index.html';

  },

  resolve: {

    load: app.asyncjs(['plugin/controller.js','plugin/jquery.ui.datepicker.js'])

  }

});

便可以了

PS:$script可以对需要加载的js进行判断,如果之前已经加载过了他会直接返回成功,也就是说只有在第一次进入日期选择界面时会去请求jquery.ui.datepicker.js退出去再进就不会去请求啦

Javascript 相关文章推荐
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 Javascript
Javascript浅谈之this
Dec 17 Javascript
实例讲解JQuery中this和$(this)区别
Dec 08 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
使用BootStrap实现标签切换原理解析
Mar 14 Javascript
bootstrap table使用入门基本用法
May 24 Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
Sep 21 Javascript
Node.js 在本地生成日志文件的方法
Feb 07 Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 Javascript
15款jQuery分布引导插件分享
Feb 04 #Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 #Javascript
使用jQueryMobile实现滑动翻页效果的方法
Feb 04 #Javascript
jQueryMobile之Helloworld与页面切换的方法
Feb 04 #Javascript
Javascript中实现trim()函数的两种方法
Feb 04 #Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
Feb 04 #Javascript
JavaScript检测实例属性, 原型属性
Feb 04 #Javascript
You might like
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
JavaScript类库D
2010/10/24 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
简单的js表单验证函数
2013/10/28 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
中学生自我评价范文
2014/02/08 职场文书
小学综合实践活动总结
2014/07/07 职场文书
工程部经理岗位职责
2015/02/02 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
总经理致辞
2015/07/29 职场文书