2016-11-20 20 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値があります。私のコンソールで

:$ qの文書について enter image description here

、私はサービスとコントローラでthen()関数を使用します。

どこに問題があるか知りませんか?

+1

success()とerror()を使用しています(1.6で廃止されました)ので、http://blog.ninja-squad.com/2015/05/28/angularjs-promises/をお読みください。連鎖を使用しないことでアンチパターンを使用しています。 –

+1

約束で$ http呼び出しをラップする必要はありません。デフォルトでAngularJSはあなたのための約束を作成します。 – tomepejo

答えて

1

あなたはあなたがdeferred.resolve(data)deferred.reject(data)を呼び出す必要があることを行うために、約束して何かを返すされていない、あなたのコードでは、この

deferred.resolve(data); 
1

ようなあなたのサービスであなたの結果を送信するために忘れてしまいました。

遅延オブジェクトを作成する代わりに、単純に$ 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関数を渡す必要があります。

関連する問題