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 相关文章推荐
JS获取scrollHeight问题想到的标准问题
May 27 Javascript
轻轻松松学JS调试(不下载任何工具)
Apr 14 Javascript
js日期时间补零的小例子
Mar 05 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
自动适应iframe右边的高度
Dec 22 Javascript
bootstrap手风琴制作方法详解
Jan 11 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
jQuery实现搜索页面关键字的功能
Feb 16 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 Javascript
Vue h函数的使用详解
Feb 18 Vue.js
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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
js jquery数组介绍
2012/07/15 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
python timestamp和datetime之间转换详解
2017/12/11 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
详解Python学习之安装pandas
2019/04/16 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
精细化工应届生求职信
2013/11/17 职场文书
2016教师节问候语
2015/11/10 职场文书
2016继续教育研修日志
2015/11/13 职场文书
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android