最近因为项目的比较大,需要加载的js文件较多,为了提高首屏页面的加载速度,需要对js文件进行按需加载,然后网上参考了一些资料,自己也深入研究一番之后,实现了按需加载控制器js文件及指令js文件的效果;
思路如下
1,借助ui-router里面的解决属性来实现预加载
2,需要借助美元controllerProvider动态去注册控制器,美元compileProvider动态去注册指令
3,需要借助问美元来帮助我们实现异步加载,具体步骤如下所示,
1,在我们定义的应用程序(在定义应用。配置()的js文件内)模块上挂载注册控制器和指令的属性,如下所示
app.register={//注意这里的美元controllerProvider是内置注册控制器的属性,compileProvider美元是内置的注册指令的属性 控制器:$ controllerProvider.register 指令:$ compileProvider.directive } >之前2,借助问美元定义一个异步加载js文件的方法(在定义路由的js文件内)
app.loadMyJs=函数(js) { 返回函数(rootScope,问美元){ var def=$ q.defer (), deps=[]; angular.isArray (js) & # 63;(deps=js): deps.push (js); 要求(deps、功能(){ rootScope。运用美元(函数(){ deffer.resolve (); }); }); 返回deffer.promise; }; }3,借助路由里面的解决属性,进行配置需要加载的控制器文件及指令文件(在定义路由的js文件内)
.state (view1, { url:“/view1”, templateUrl:“临时/partial1.html”, 控制器:“MyCtrl1”, 解决:{//需要动态加载的控制器及指令js文件,其它js文件以此类推 deps: app.loadMyJs(['。/控制器/my-ctrl-1 ', '。/指令/加载']) } })4,通过第一步先挂载在应用上的属性来进行动态注册控制器或指令
//注册控制器(对应的控制器js文件内) app.register。控制器(MyCtrl1,函数(范围、css,美元rootScope美元){//控制器里面的内容 });//注册指令(对应的指令js文件内) app.register。指令(“加载”功能(){ 返回{ 限制:“AE”, 替换:没错, 类模板:“& lt; div=婢摺痭g-show=' isLoading祝辞& lt; span> loading & lt;/div>” } }); >之前如果有服务或过滤器需要按需加载也是类似的方法,另外如果是公共的服务,指令或过滤器等不需要进行按需加载的文件就可以使用普通的angular.module()的方式来定义即可。
最后这只是实现按需加载js文件中的一种思路,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
angularJS + requireJS实现控制器及指令的按需加载示例