angularJS+requireJS實現controller及directive的按需加載

最近由於項目的比較大,須要加載的js文件較多,爲了提升首屏頁面的加載速度,須要對js文件進行按需加載,而後網上參考了一些資料,本身也深刻研究一番以後,實現了按需加載控制器js文件及指令js文件的效果;思路以下,一、藉助ui-router裏面的resolve屬性來實現預加載,二、須要藉助$controllerProvider動態去註冊控制器,$compileProvider動態去註冊指令,三、須要藉助$q來幫助咱們實現異步加載,具體步驟以下所示;css

一、在咱們定義的app(在定義app.config()的js文件內)模塊上掛載註冊控制器和指令的屬性,以下所示 html

app.register = {
    //注意這裏的$controllerProvider是內置註冊控制器的屬性,$compileProvider是內置的註冊指令的屬性 controller: $controllerProvider.register, directive: $compileProvider.directive }

 

二、藉助$q定義一個異步加載js文件的方法(在定義路由的js文件內)promise

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;
                };
            }

三、藉助路由裏面的resolve屬性,進行配置須要加載的控制器文件及指令文件(在定義路由的js文件內)app

.state('view1',{
            url: '/view1',
            templateUrl: 'temp/partial1.html',
            controller: 'MyCtrl1',
            resolve:{
          //須要動態加載的控制器及指令js文件,其它js文件以此類推 deps:app.loadMyJs([
'./controllers/my-ctrl-1','./directives/loading']) } })

四、經過第一步先掛載在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>"
      }
    });  
ide

若是有服務or過濾器須要按需加載也是相似的方法,另外若是是公共的服務,指令or過濾器等不須要進行按需加載的文件就可使用普通的angular.module()的方式來定義便可;ui

最後這只是實現按需加載js文件中的一種思路,但願對您有所幫助。url

相關文章
相關標籤/搜索