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 相关文章推荐
对采用动态原型方式无法展示继承机制得思考
Dec 04 Javascript
jQuery版Tab标签切换
Mar 16 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
Oct 21 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
jQuery链式调用与show知识浅析
May 11 Javascript
jquery设置表单元素为不可用的简单代码
Jul 04 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
Oct 11 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
详解mpvue实现对苹果X安全区域的适配
Jul 31 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
vue在线动态切换主题色方案
Mar 26 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时间格式控制符对照表分享
2013/07/23 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
Ext 今日学习总结
2010/09/19 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
JavaScript面向对象精要(下部)
2017/09/12 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
python中偏函数partial用法实例分析
2015/07/08 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python 2.7.14安装图文教程
2018/04/08 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
美国羊皮公司:Overland
2018/01/15 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
劳资员岗位职责
2013/11/11 职场文书
护士演讲稿范文
2014/01/05 职场文书
入股协议书
2014/04/14 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书