离子v1存储令牌服务不工作angularjs

时间:2017-05-12 11:29:42

标签: angularjs cordova ionic-framework angularjs-service angularjs-factory

我正在尝试将登录服务中的令牌存储在变量中,以便稍后检索它并将其添加到标头中,以便能够从API中使用更多服务。我能够登录并获取令牌,但是当我试图从我存储它的变量中取回它时它没有被保存,不太确定我做错了因为没有语法错误。任何帮助表示赞赏。这是我的代码示例:

  1. services.js

    .service('loginService', function($http, $ionicPopup, $window) {
    
      var token = '';
    
      return {
    
       login: function(username, password, practicePin){
    
         var url = 'https://localhost/login';
    
         var parameter = JSON.stringify({username:username, password:password, pin:practicePin});
    
         $http.post(url, parameter).then(function(response){
    
             token = response.headers()['token'];
    
             var alertPopup = $ionicPopup.alert({
               title: 'Welcome ' + username,
               subTitle: token
             });
    
             alertPopup.then(function(res) {
               $window.location.href = 'home.html';
             });
    
         }).
         error(function(data, status, headers, config) {
           $ionicPopup.alert({
             title: 'BAD CREDENTIALS'
           });
         })
       },
    
       getToken: function(){
         return token;
       }
      }
    })
    
  2. 此时,令牌将保存在变量as the picture shows

    但是当我尝试从控制器返回令牌时,它是空的。

    .controller('FindSlotCtrl', function($scope  , $ionicPopup, $state, loginService) {
    
     $scope.login = function(username, password, practicePin) {
    
       loginService.login(username, password, practicePin);
    
     };
    
     $scope.token = function(){
    
       $ionicPopup.alert({
    
         title: 'TOKEN -> ' + loginService.getToken()
    
       });
    
     };
    }
    

    Here's the second alert并且令牌变量似乎是空的,我试图存储在一个数组中,第一次执行时,数组的.length等于1,但是在第二次警告时它会显示给我长度= 0。

    我还尝试设置并从另一个服务/工厂获取令牌并将其注入loginService但是我得到了相同的结果。

1 个答案:

答案 0 :(得分:0)

在第一个警报中,您可以看到令牌,因为您的令牌是从服务器检索的。稍后调用getToken()时,它会返回一个未定义的值,因为该标记是未定义的。

为了能够重用令牌,让服务中的登录功能返回令牌,如下所示:

login: function(username, password, practicePin){

 var url = 'https://localhost/login';

 var parameter = JSON.stringify({username:username, password:password, pin:practicePin});

 $http.post(url, parameter).then(function(response){
     return response.headers()['token'];
 }).
 error(function(data, status, headers, config) {
   $ionicPopup.alert({
     title: 'BAD CREDENTIALS'
   });
 })

}

然后,在您的控制器中保存令牌:

$scope.login = function(username, password, practicePin) {
    $scope.token = loginService.login(username, password, practicePin);
};

然后,您可以通过这种方式提醒它:

$scope.alertToken = function(){
   $ionicPopup.alert({
     title: 'TOKEN -> ' + $scope.token
   });
 };