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 相关文章推荐
自适应图片大小的弹出窗口
Jul 27 Javascript
20个非常有用的PHP类库 加速php开发
Jan 15 Javascript
利用jQuery实现可输入搜索文字的下拉框
Oct 23 Javascript
js控制多图左右滚动切换效果代码分享
Aug 26 Javascript
js+html5实现canvas绘制椭圆形图案的方法
May 21 Javascript
js代码延迟一定时间后执行一个函数的实例
Feb 15 Javascript
js禁止浏览器的回退事件
Apr 20 Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 Javascript
vue中使用v-model完成组件间的通信
Aug 22 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
Jan 05 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
Aug 12 Javascript
js 图片懒加载的实现
Oct 21 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
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
php时间戳转换的示例
2014/03/31 PHP
XHProf报告字段含义的解析
2016/05/17 PHP
js获取div高度的代码
2008/08/09 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
python中xrange和range的区别
2014/05/13 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
如何用Python徒手写线性回归
2021/01/25 Python
python如何构建mock接口服务
2021/01/28 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
会计岗位职责
2015/02/03 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
首都博物馆观后感
2015/06/05 职场文书
高一地理教学工作总结
2015/08/12 职场文书
表扬信范文
2019/04/22 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
利用Python实时获取steam特惠游戏数据
2022/06/25 Python
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技