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 相关文章推荐
原型方法的不同写法居然会影响调试的解决方法
Mar 08 Javascript
javascript:以前写的xmlhttp池,代码
May 18 Javascript
jquery插件 autoComboBox 下拉框
Dec 22 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
基于JQuery 滑动与动画的说明介绍
Apr 18 Javascript
jQuery中delegate()方法的用法详解
Oct 13 Javascript
Angular2  NgModule 模块详解
Oct 19 Javascript
浅谈javascript中的数据类型转换
Dec 27 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
Dec 14 Javascript
对类Vue的MVVM前端库的实现代码
Sep 07 Javascript
使用axios请求接口,几种content-type的区别详解
Oct 29 Javascript
vue自定义switch开关组件,实现样式可自行更改
Nov 01 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 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
javascript,jquery闭包概念分析
2010/06/19 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
js实现五星评价功能
2017/03/08 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
vue实现分页栏效果
2019/06/28 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
python使用cPickle模块序列化实例
2014/09/25 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
Python 多核并行计算的示例代码
2017/11/07 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
python 限制函数调用次数的实例讲解
2018/04/21 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
.net C#面试题
2012/08/28 面试题
工商治理实习生的自我评价
2014/01/15 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
2016公司新年问候语
2015/11/11 职场文书
安全教育培训心得体会
2016/01/15 职场文书
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python