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 相关文章推荐
jQuery获得document和window对象宽度和高度的方法
Mar 25 Javascript
javascript+html5实现仿flash滚动播放图片的方法
Apr 27 Javascript
JS数字抽奖游戏实现方法
May 04 Javascript
JavaScript对象数组排序实例方法浅析
Jun 15 Javascript
js实现鼠标移动到图片产生遮罩效果
Oct 21 Javascript
JS实现十字坐标跟随鼠标效果
Dec 25 Javascript
Vue组件中slot的用法
Jan 30 Javascript
js实现轮播图的完整代码
Oct 26 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
Oct 16 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
node.js事件轮询机制原理知识点
Dec 22 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
Mar 26 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自动识别字符集并完成转码详解
2013/08/02 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
python模块restful使用方法实例
2013/12/10 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
Python实现队列的方法
2015/05/26 Python
Python代码实现KNN算法
2017/12/20 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
分享vim python缩进等一些配置
2018/07/02 Python
python实现公司年会抽奖程序
2019/01/22 Python
python实现学员管理系统
2019/02/26 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
Python对列表的操作知识点详解
2019/08/20 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
经典c++面试题二
2015/08/14 面试题
后勤岗位职责
2013/11/26 职场文书
业务副厂长岗位职责
2014/01/03 职场文书
财务总经理岗位职责
2014/02/16 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
毕业实习计划书
2015/01/16 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang