angularJS+requireJS实现controller及directive的按需加载示例


Posted in Javascript onFebruary 20, 2017

最近因为项目的比较大,需要加载的js文件较多,为了提高首屏页面的加载速度,需要对js文件进行按需加载,然后网上参考了一些资料,自己也深入研究一番之后,实现了按需加载控制器js文件及指令js文件的效果;

思路如下

1、借助ui-router里面的resolve属性来实现预加载

2、需要借助$controllerProvider动态去注册控制器,$compileProvider动态去注册指令

3、需要借助$q来帮助我们实现异步加载,具体步骤如下所示;

1、在我们定义的app(在定义app.config()的js文件内)模块上挂载注册控制器和指令的属性,如下所示 

app.register = {
//注意这里的$controllerProvider是内置注册控制器的属性,$compileProvider是内置的注册指令的属性

    controller: $controllerProvider.register,

    directive: $compileProvider.directive

   }

2、借助$q定义一个异步加载js文件的方法(在定义路由的js文件内)

app.loadMyJs = function(js){
        return function($rootScope, $q){
          var deffer = $q.defer(),
            deps=[];
          angular.isArray(js) ? (deps = js) : deps.push(js);
          require(deps,function(){
            $rootScope.$apply(function(){
              deffer.resolve();
            });
          });
          return deffer.promise;
        };
      }

3、借助路由里面的resolve属性,进行配置需要加载的控制器文件及指令文件(在定义路由的js文件内)

.state('view1',{
      url: '/view1',
      templateUrl: 'temp/partial1.html',
      controller: 'MyCtrl1',
      resolve:{




//需要动态加载的控制器及指令js文件,其它js文件以此类推
        deps:app.loadMyJs(['./controllers/my-ctrl-1','./directives/loading'])
      }
    })

4、通过第一步先挂载在app上的属性来进行动态注册控制器or指令

//注册控制器(对应的控制器js文件内)
app.register.controller('MyCtrl1', function ($scope,$css,$rootScope) {
    //控制器里面的内容
    
  });

//注册指令(对应的指令js文件内)

app.register.directive("loading",function (){


return {



restrict: "AE",



replace: true,



template: "<div class='mask' ng-show='isLoading'><span>loading</span></div>"



}


}); 

如果有服务or过滤器需要按需加载也是类似的方法,另外如果是公共的服务,指令or过滤器等不需要进行按需加载的文件就可以使用普通的angular.module()的方式来定义即可;

最后这只是实现按需加载js文件中的一种思路,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
轻轻松松学习JavaScript
Feb 25 Javascript
jquery的ajax跨域请求原理和示例
May 08 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 Javascript
Angular 路由route实例代码
Jul 12 Javascript
Node调用Java的示例代码
Sep 20 Javascript
教你用Cordova打包Vue项目的方法
Oct 17 Javascript
微信小程序如何连接Java后台
Aug 08 Javascript
JS实现长图上下滚动效果
Mar 19 Javascript
JavaScript实现简单进度条效果
Mar 25 Javascript
基于javascript实现日历功能原理及代码实例
May 07 Javascript
vue中jsonp插件的使用方法示例
Sep 10 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
Feb 19 #Javascript
js 输入框 正则表达式(菜鸟必看教程)
Feb 19 #Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
Feb 19 #Javascript
基于Angular.js实现的触摸滑动动画实例代码
Feb 19 #Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
Feb 19 #Javascript
jQuery实现一个简单的轮播图
Feb 19 #Javascript
js 博客内容进度插件详解
Feb 19 #Javascript
You might like
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
js或css实现滚动广告的几种方案
2010/01/28 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
Python3.6正式版新特性预览
2016/12/15 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
浅述python2与python3的简单区别
2018/09/19 Python
python生成lmdb格式的文件实例
2018/11/08 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
简单了解django缓存方式及配置
2019/07/19 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
主管职责范文
2013/11/09 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
工作经历证明书范文
2014/11/02 职场文书
五星级酒店宣传口号
2015/12/25 职场文书