1

嗨我想加載我的任何控制器之前從工廠加載數據。我找到了一種方法來解決這個問題:在控制器之前加載來自服務器的數據

angular.module('agent', ['ngRoute','ui.bootstrap','general_module', 'order_module','customer_module']).config(['$routeProvider', function($routeProvider) { 
    $routeProvider.when('/customer', { 
    templateUrl: 'customer_module/partials/customer.php', 
    resolve:{ 
     'MyServiceData':function(loginvalidation){ 
     // MyServiceData will also be injectable in your controller, if you don't want this you could create a new promise with the $q service 
     var a=loginvalidation.check_usertype(); 
     }} 
    } 
    ); 
    $routeProvider.otherwise({redirectTo: '/customer'}); 
}]); 

但問題是我必須在每一條路徑上都複製這個。有沒有辦法在angularjs中編寫一次代碼以在啓動任何控制器之前加載服務(不重複我的代碼)?

感謝

+2

簡單的方法:只需將您的解析體放入某個方法的某個方法中,然後爲每個路徑設置resolve:myResolve()。請參閱:http://stackoverflow.com/questions/11972026/delaying-angularjs-route-change-until-model-loaded-to-prevent-flicker –

回答

1

一兩件事,我做的,就是在我的控制器功能,我沒有在根級別的任何代碼。只有函數聲明。在這裏看到:

angular.module('app').controller('TestCtrl',function($scope){ 

    //no code here at root level, except for some init call 
    init(); 

    function init(){ 
     //some init code 
     service.getSomeData().then(function(data){ 
      //Tell your controller to run here 
      $scope.dataLoaded = true; 
      doSomethingWithData(data); 
     }); 
    } 

    function addSomeWatch(){ 
     //some watch code here 
    } 

    function foo(bar){ 
     //something crazy 
    } 
}); 

,這依賴於唯一的一點是,你的服務調用的所有回報的承諾,這是他們應該做的反正。

angular.module('app').factory('TestService', function(){ 

    return { 
     getSomeData : function(){ 
      var d = $q.deferred(); 
      $http.get('someurl') 
       .then(function(resp){ 
        d.resolve(resp); 
       }); 
      return d.promise; 
     } 
    } 

}); 
相關問題