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 相关文章推荐
如何使用Javascript正则表达式来格式化XML内容
Jul 04 Javascript
js图片预加载示例
Apr 30 Javascript
node.js中的fs.renameSync方法使用说明
Dec 16 Javascript
JavaScript中的值类型转换介绍
Dec 31 Javascript
javascript冒泡排序小结
Apr 10 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
Js经典案例的实例代码
May 10 Javascript
MVVM 双向绑定的实现代码
Jun 21 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 Javascript
基于Vue 实现一个中规中矩loading组件
Apr 03 Javascript
JavaScript中的一些实用小技巧总结
Apr 07 Javascript
Vue 理解之白话 getter/setter详解
Apr 16 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图像处理类库MagickWand用法实例分析
2015/05/21 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
详解webpack运行Babel教程
2018/06/13 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
在双python下设置python3为默认的方法
2018/10/31 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
大学四年学习的自我评价分享
2013/12/09 职场文书
上班玩手机检讨书
2014/02/17 职场文书
内勤主管岗位职责
2014/04/03 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
国际金融专业自荐信
2014/07/05 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
医院保洁员管理制度
2015/08/05 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
pytorch 如何使用batch训练lstm网络
2021/05/28 Python