2014-12-20 98 views
0

我初始化這樣在$ rootScope我的應用程序運行功能的函數 -

angular.module('student').run(function($sce,$rootScope, $location,mvNotifier,$http) { 
    $rootScope.getUser = function(){ 
     var url = '/getUser'; 
     $http({method:'POST',url:url}).success(function(data,status,headers,config){ 
      if(status==200){ 
       $rootScope.user = data; 
       var date = new Date(data.date); 
       $rootScope.user.joinMonth=date.toUTCString().split(' ')[2]; 
       $rootScope.user.joinYear=date.getYear();  
      } 
      else 
       mvNotifier.error(data.reason); 
     }); 
    }; 
}); 

現在,當在控制器我想這一點 -

angular.module('student').controller('ProfileController', function($scope,$http,$location,mvNotifier,$rootScope) { 
    if(!$rootScope.user){ 
     $rootScope.getUser(); 
    } 
    $scope.firstName = $rootScope.user.firstName;   
}); 

它如果已經設置了$ rootScope.user,則工作正常。但是如果它有使至$ rootScope.getUser()的調用在這種情況下,它給出了一個錯誤 -

TypeError: Cannot read property 'firstName' of undefined 

所以,我想知道可能是其原因的getUser是一個異步調用,如果它是怎麼做的我解決這個問題,如果它是不是我要去哪裏錯了,請建議

+1

所有'$ http'都是異步的。我的建議是重寫'getUser'來返回'$ http' promise並在控制器中使用'then'。你可以緩存請求,所以它不必每次都要命中服務器 – charlietfl

+0

多數民衆贊成在我的想法,但我該如何修復錯誤,並在$ scope.getUser調用完成後應用$ scope.firstName完成 –

回答

2

你可以嘗試這樣的事情

$rootScope.getUser = function() { 
    var url = '/getUser'; 
    return $http({ 
     method: 'POST', 
     url: url, 
     cache: true /* cache true so we don't have to get from server each time*/ 
    }).then(function (resp) { 
     var data = resp.data; 
     $rootScope.user = data; 
     var date = new Date(data.date); 
     $rootScope.user.joinMonth = date.toUTCString().split(' ')[2]; 
     $rootScope.user.joinYear = date.getYear(); 
     return $rootScope.user; 
    }, function(err){ 
     alert('OOps server errror') 
    }); 
}; 

在控制器:

$rootScope.getUser().then(function(user){ 
    $scope.firstName = user.firstName;  
});