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

ionic v1在服务中存储令牌不工作angularjs,angularjs,cordova,ionic-framework,angularjs-service,angularjs-factory,Angularjs,Cordova,Ionic Framework,Angularjs Service,Angularjs Factory,我试图将登录服务中的令牌存储在变量中,以便稍后检索并将其添加到头中,以便能够使用API中的更多服务。我可以登录并获取令牌,但当我试图从存储它的变量中获取它时,它没有被保存,因为没有语法错误,所以不太确定我做错了什么。感谢您的帮助。下面是我的代码示例: services.js .service('loginService', function($http, $ionicPopup, $window) { var token = ''; return { login: funct

我试图将登录服务中的令牌存储在变量中,以便稍后检索并将其添加到头中,以便能够使用API中的更多服务。我可以登录并获取令牌,但当我试图从存储它的变量中获取它时,它没有被保存,因为没有语法错误,所以不太确定我做错了什么。感谢您的帮助。下面是我的代码示例:

  • 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;
       }
      }
    })
    
  • 此时,令牌保存在变量中

    但是当我试图从控制器取回令牌时,它是空的

    .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()
    
       });
    
     };
    }
    
    第一次执行时,令牌变量似乎是空的,我试图存储在数组中。数组的长度等于1,但在第二次警告时,它会显示length=0


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

    在第一个警报中,您可以看到令牌,因为您的令牌是从服务器检索的。稍后调用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
       });
     };
    

    在第一个警报中,您可以看到令牌,因为您的令牌是从服务器检索的。稍后调用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
       });
     };
    

    最后,我通过使用$window.localStorage获得了我想要的结果,这可能不是解决问题的最佳方法,但至少我可以让它工作。下面是代码示例:

  • 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'
            });
         })
        }
      }
    })
    
  • 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
    
         });
    
      };
    })
    
    登录后第二个屏幕的图片


  • 最后,我通过使用$window.localStorage获得了我想要的结果。localStorage可能不是解决这个问题的最佳方法,但至少我可以让它工作。下面是代码示例:

  • 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'
            });
         })
        }
      }
    })
    
  • 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
    
         });
    
      };
    })
    
    登录后第二个屏幕的图片


  • 它似乎没有按预期工作,即使我从标题返回令牌$ionicPopup.alert({title:response.headers()['aerona-auth-token']});返回response.headers()['aerona-auth-token'];警报显示令牌,但当我尝试在变量上设置它时,它在控制器上显示undefined:$scope.login=function(username,password,practicePin){$scope.token=loginService.login(username,password,practicePin);$ionicPopup.alert({title:'-'+$scope.token+'-'});它似乎没有像预期的那样工作,即使我从标题返回令牌$ionicPopup.alert({title:response.headers()['aerona-auth-token']});返回response.headers()['aerona-auth-token'];警报显示令牌,但当我尝试在变量上设置它时,它在控制器上显示undefined:$scope.login=function(username,password,practicePin){$scope.token=loginService.login(username,password,practicePin);$ionicPopup.alert({title:'-'+$scope.token+'-'});