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 相关文章推荐
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
Sep 26 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
Oct 22 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
Sep 22 Javascript
js对字符的验证方法汇总
Feb 04 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
详解javascript立即执行函数表达式IIFE
Feb 13 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
Jan 10 Javascript
在小程序中使用Echart图表的示例代码
Aug 02 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
express 项目分层实践详解
Dec 10 Javascript
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 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
一个目录遍历函数
2006/10/09 PHP
php中的时间处理
2006/10/09 PHP
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
关于护士节的演讲稿
2014/05/26 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
运动会广播稿300字
2015/08/19 职场文书
任命书格式模板
2015/09/22 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书