ionic v1 在服务中存储令牌不起作用 angularjs

ionic v1 storing token in service not working angularjs

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

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

此时token保存在变量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 并且 token 变量似乎是空的,我试图存储在一个数组中,我第一次执行时数组的长度等于 1,但是在第二次警报时它会告诉我长度 = 0.

我还尝试设置并从另一个 service/factory 获取令牌并将其注入 loginService,但无论哪种方式我都得到了相同的结果。

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

为了能够重复使用令牌,请在您的服务中使用登录功能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){
     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
   });
 };

最后我用$window.localStorage得到了我想要的结果,虽然不是最好的解决方法,但至少我可以让它工作。这是代码示例:

  1. service.js

    .service('loginService', function($http, $ionicPopup, $window) {
    
    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){
    
         var token = response.headers()['token']
    
         $window.localStorage['token'] = token;
    
         var alertPopup = $ionicPopup.alert({
    
             title: 'Welcome ' + username
    
         });
    
         alertPopup.then(function(res) {
    
           $window.location.href = 'home.html';
    
         });
    
        }).
        error(function(data, status, headers, config) {
            $ionicPopup.alert({
              title: 'BAD CREDENTIALS'
            });
         })
        }
      }
    })
    
  2. controllers.js

    .controller('FindSlotCtrl', function($scope, $window, $ionicPopup,loginService) {
    
      $scope.token = $window.localStorage['token'];
    
      $scope.login = function(username, password, practicePin) {
    
       loginService.login(username, password, practicePin);
    
      };
    
      $scope.tokenAlert = function(){
    
         $ionicPopup.alert({
    
           title: $scope.token
    
         });
    
      };
    })
    

    登录后第二屏图片