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_03(ExtJs Grid的简单使用)
Oct 02 Javascript
执行iframe中的javascript方法
Oct 07 Javascript
javascript 事件查询综合 推荐收藏
Mar 10 Javascript
JavaScript中的值类型转换介绍
Dec 31 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
Mar 03 Javascript
JavaScript列表框listbox全选和反选的实现方法
Mar 18 Javascript
JavaScript让Textarea支持tab按键的方法
Jun 26 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
Sep 06 Javascript
JavaScript登录验证基础教程
Nov 01 Javascript
Mac下安装vue
Apr 11 Javascript
详解vue-cli3 中跨域解决方案
Apr 10 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
Javascript实现异步编程的过程
2018/06/18 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
python判断端口是否打开的实现代码
2013/02/10 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Python列表与元组的异同详解
2019/07/02 Python
什么是python的id函数
2020/06/11 Python
python Pexpect模块的使用
2020/12/25 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
服务行业个人求职的自我评价
2013/12/12 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
金融与证券专业求职信
2014/06/22 职场文书
大学课外活动总结
2014/07/09 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
2015年副班长工作总结
2015/05/15 职场文书
2015年防汛工作总结
2015/05/15 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
Python 实现定积分与二重定积分的操作
2021/05/26 Python