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创建命名空间(namespace)的最简实现
Dec 11 Javascript
JavaScript中的事件处理
Jan 16 Javascript
JavaScript 事件查询综合
Jul 13 Javascript
lyhucSelect基于Jquery的Select数据联动插件
Mar 29 Javascript
jQuery语法总结和注意事项小结
Nov 11 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
Jun 26 Javascript
使用时间戳解决ie缓存的问题
Aug 20 Javascript
javascript trim函数在IE下不能用的解决方法
Sep 12 Javascript
从零学习node.js之模块规范(一)
Feb 21 Javascript
javascript闭包的使用之按钮切换功能
Aug 30 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
Sep 11 Javascript
JavaScript常用工具函数大全
May 06 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
Terran兵种介绍
2020/03/14 星际争霸
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
PHP脚本的10个技巧(4)
2006/10/09 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
php生成扇形比例图实例
2013/11/06 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
简单JS代码压缩器
2006/10/12 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python二分查找详解
2015/09/13 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
python如何实现视频转代码视频
2019/06/17 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
大四学年自我鉴定
2013/11/13 职场文书
大二学习计划书范文
2014/04/27 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
V Rising 服务器搭建图文教程
2022/06/16 Servers