2015-09-24 84 views
0

我開始使用ocLazyload來延遲加載我的AngularJs控制器中的幾個。我用它一起$routeProvider像這樣當使用ocLazyLoad時注入延遲加載的AngularJS控制器

$routeProvider.when("/login", { 
     templateUrl: "login.html", 
     resolve: { 
      loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) { 
       return $ocLazyLoad.load('LoginCtrl.js'); 
      }] 
     } 
    }). 

和這工作正常。

我有另一個路由定義,它使用resolve屬性來加載控制器之前解決一些項目。

when("/dashboard", { 
     templateUrl: "dashboard.html", 
     controller: "DashboardCtrl", 
     resolve: { 
      profileData: getProfile, 
      count : getCount 
     } 
    }). 

現在我想延遲加載該控制器也和我想它像在這種情況下,這個

when("/dashboard", { 
     templateUrl: "dashboard.html", 
     resolve: { 
      profileData: getProfile, 
      count : getCount, 
      loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) { 
       return $ocLazyLoad.load(['DashboardCtrl.js']); 
      }] 
     } 
    }). 

該頁面加載,但profileDatacount不會被注入到控制器。控制器的定義如下。

var app = angular.module('gt'); 
app.controller('DashboardCtrl', ['$scope', '$rootScope', 'profileData', 'count', 
    function($scope, $rootScope, profileData, count) { 
... 
}]); 

在調試時,我意識到getProfilegetCount GET方法的調用,但它是異步進行的,並且控制器也懶的負載,而無需等待這些方法。如何在同一時間注入和延遲加載?我可以使用承諾以任何方式解決此問題嗎?

我使用AngularJS 1.3.10 & ocLazyLoad 1.0.5版本

getProfile功能參考

var getProfile = function($q, $http, Profile, localStorageService) { 
     var deferred = $q.defer(); 
     if (!localStorageService.get("loggedInUser")) { 
      $http.post('/loggedin').success(function(user) { 
       if (user) { 
        localStorageService.set("loggedInUser", user.email) 
        Profile.get(localStorageService.get("loggedInUser"), function(profileData) { 
         if (profileData) { 
          deferred.resolve(profileData); 
         } else { 
          deferred.resolve(); 
         } 
        }); 
       } else { 
        deferred.reject(); 
       } 
      }); 
     } else { 
      Profile.get(localStorageService.get("loggedInUser"), function(profileData) { 
       if (profileData) { 
        deferred.resolve(profileData); 
       } else { 
        deferred.resolve(); 
       } 
      }); 
     } 
     return deferred.promise; 
    } 

getProfile.$inject = ["$q", "$http", "Profile", "localStorageService"]; 
+0

這是一個有用的信息。 –

回答

1

我能得到與$routeProvider

when("/dashboard", { 
    templateUrl: "dashboard.html", 
    controller :"DashboardCtrl" 
    resolve: { 
     profileData: getProfile, 
     count : getCount, 
     loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) { 
      return $ocLazyLoad.load(['DashboardCtrl.js']); 
     }] 
    } 
}). 

以下配置,其中DashboardCtrlDashboardCtrl.js

0

確實getProfilegetCount返回一個承諾?我想這是問題,因爲這是必需的。放入resolve的每個對象都應該返回一個承諾。看到the documention

+0

是的。添加getProfile方法供您參考 –

0

如果您需要解決了一個特定的順序發生定義的控制這方面的工作,你可以將它們注入另一個解析中,如下所示:

when("/dashboard", { 
    templateUrl: "dashboard.html", 
    resolve: { 
     profileData: getProfile, 
     count : getCount, 
     loadCtrl: ['$ocLazyLoad', 'profileData', 'count', function($ocLazyLoad, profileData, count) { 
      return $ocLazyLoad.load(['DashboardCtrl.js']); 
     }] 
    } 
}).