2014-12-20 3 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;   
}); 

It отлично работает, если $ rootScope.user уже установлен. но если он должен сделать вызов $ rootScope.getUser() в этом случае он дает ошибку -

TypeError: Cannot read property 'firstName' of undefined 

Итак, я задаюсь вопросом, может быть его потому, что GetUser асинхронный вызов, если это как я это исправить, и если это не там, где я буду неправильно, пожалуйста, предложите

+1

все '$ http' асинхронны. Мое предложение состоит в том, чтобы переписать 'getUser', чтобы вернуть обещание' $ http' и использовать 'then' в контроллере. Вы можете кэшировать запрос, чтобы он не ударял сервер каждый раз – charlietfl

+0

, что я думал, но как исправить ошибку и применить $ scope.firstName после вызова $ scope.getUser завершен –

ответ

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