2016-11-20 64 views
0

我在控制器中從服務中獲取價值時遇到問題。 我從API使用服務的價值:AngularJS從服務功能中獲取價值

angular.module('app').factory('service', 
    ['$q', '$rootScope', '$timeout', '$http', 
    function ($q, $rootScope, $timeout, $http) { 

    // create user variable 
    var user = null; 

    // return available functions for use in the controllers 
    return ({ 
     isLoggedIn: isLoggedIn, 
     getUserStatus: getUserStatus, 
     login: login, 
     getEmail: getEmail 
    }); 

    function isLoggedIn() { 
     if(user) { 
     return true; 
     } else { 
     return false; 
     } 
    } 

    function getUserStatus() { 
     return $http.get('/user/status') 
     // handle success 
     .success(function (data) { 
     if(data.status){ 
      user = true; 
     } else { 
      user = false; 
     } 
     }) 
     // handle error 
     .error(function (data) { 
     user = false; 
     }); 
    } 

function login(username, password) { 

     // create a new instance of deferred 
     var deferred = $q.defer(); 

     // send a post request to the server 
     $http.post('/user/login', 
     {username: username, password: password}) 
     // handle success 
     .success(function (data, status) { 
      if(status === 200 && data.status){ 
      user = true; 
      deferred.resolve(); 
      } else { 
      user = false; 
      deferred.reject(); 
      } 
     }) 
     // handle error 
     .error(function (data) { 
      user = false; 
      deferred.reject(); 
     }); 

     // return promise object 
     return deferred.promise; 

    } 

    function getEmail() { 
     // create a new instance of deferred 
     var deferred = $q.defer(); 

     $http.get('/email/'+$rootScope.username) 
     .success(function (data) { 
      console.log(data); 
      deferred.resolve(); 
     }) 
     .error(function (data) { 
     deferred.reject(); 
     }) 

     return deferred.promise; 
    } 
}]); 

我試圖在控制器到達和使用價值:

angular.module('app') 
    .controller('myController', ['$rootScope', '$scope', '$state', '$http', '$q', 'service', function ($rootScope, $scope, $state, $http, $q, service) { 

    $scope.email; 

    $scope.getEmail = function() { 
     // call getEmailFromDB from service 
    service.getEmail() 
     // handle success 
     .then(function (data) { 
      $scope.email = data; //here I got undefined 
      console.log($scope.email); 
     }) 
     // handle error 
     .catch(function() { 
      $scope.error = true; 
      $scope.errorMessage = "[email protected]"; 
     }); 
    }; 
    $scope.getEmail(); 
}]); 

但在控制器有undefined值。

在我的控制檯: enter image description here

關於$ q的文檔,我用在服務和控制器then()功能。

有誰知道問題在哪裏?

+1

請閱讀http://blog.ninja-squad.com/2015/05/28/angularjs-promises/,因爲您正在使用已棄用(並在1.6版中刪除)的success()和error(),並且您正在使用反模式,因爲不使用鏈接。 –

+1

您不需要在$ promise中包裝$ http調用。默認情況下,AngularJS爲您創建承諾。 – tomepejo

回答

1

你忘了把你的結果在服務這樣

deferred.resolve(data); 
1

在你的代碼不與承諾返回任何東西,這樣做,你必須調用deferred.resolve(data)deferred.reject(data)

您可以簡單地返回$ http請求,而不是創建延遲對象。 例子:

function getEmail() { 
    return $http.get('/email/'+$rootScope.username).then(
     function success(data){ 
      console.log(data); 
      return data; 
     }, 
     function error(data){ 
      console.error(data); 
     } 
    ); 
} 

還要注意的是.success().error()已過時,應使用.then()並通過successerror功能。