2016-11-23 6 views
0

Я пытаюсь обрабатывать обработку ошибок/ошибок из службы в контроллере.Угловой JS: Как передать ответ от службы контроллеру?

Я попытался это:

Услуги:

.factory('AuthenticationService', 
['Base64', '$http', '$cookieStore', '$rootScope', 
function (Base64, $http, $cookieStore, $rootScope) { 
    var service = {}; 

    service.Login = function (username, password, callback) { 

     var authdata = Base64.encode(username + ':' + password); 

     $rootScope.globals = { 
      currentUser: { 
       username: username, 
       authdata: authdata 
      } 
     }; 

     $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; 
     $cookieStore.put('globals', $rootScope.globals); 

     $http.post('http://localhost:8080/v1/login', { username: username, password: password }) 
      .success(function (response) { 
       callback(response); 
      }); 
    }; 

    service.ClearCredentials = function() { 
     $rootScope.globals = {}; 
     $cookieStore.remove('globals'); 
     $http.defaults.headers.common.Authorization = 'Basic '; 
    }; 

    return service; 
}]) 

и контроллер:

.controller('LoginController', 
['$scope', '$rootScope', '$location', 'AuthenticationService', 
function ($scope, $rootScope, $location, AuthenticationService) { 
    // reset login status 
    AuthenticationService.ClearCredentials(); 

    $scope.login = function() { 
     $scope.dataLoading = true; 
     AuthenticationService.Login($scope.username, $scope.password, function (response) { 
      if(response.success) { 
       $location.path('/'); 
      } else { 
       $scope.error= response.message; 
       $scope.dataLoading = false; 
      } 
     }); 
    }; 
}]); 

Если я пытаюсь с предупреждением, он показывает только на службе, но не в контроллер.

ответ

0

Использование обещаний:

.factory('AuthenticationService', 
['Base64', '$http', '$cookieStore', '$rootScope', '$q', 
function (Base64, $http, $cookieStore, $rootScope, $q) { 
    var service = {}; 

    service.Login = function (username, password, callback) { 

     var deferred = $q.defer(); 

     var authdata = Base64.encode(username + ':' + password); 

     $rootScope.globals = { 
      currentUser: { 
       username: username, 
       authdata: authdata 
      } 
     }; 

     $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; 
     $cookieStore.put('globals', $rootScope.globals); 

     $http.post('http://localhost:8080/v1/login', { username: username, password: password }) 
      .then(function (response) { 
       deferred.resolve(response); 
      }, function(error) { 
       deferred.reject(error); 
      }); 

     return deferred.promise; 
    }; 

    service.ClearCredentials = function() { 
     $rootScope.globals = {}; 
     $cookieStore.remove('globals'); 
     $http.defaults.headers.common.Authorization = 'Basic '; 
    }; 

    return service; 
}]) 

И контроллер

.controller('LoginController', 
['$scope', '$rootScope', '$location', 'AuthenticationService', 
function ($scope, $rootScope, $location, AuthenticationService) { 
    // reset login status 
    AuthenticationService.ClearCredentials(); 

    $scope.login = function() { 
     $scope.dataLoading = true; 
     AuthenticationService.Login($scope.username, $scope.password) 
      .then(function(success) { 
       $location.path('/'); 
      }, function(error) { 
       $scope.error= response.message; 
       $scope.dataLoading = false; 
      }); 
    }; 
}]); 
+0

"ответ не определен" -.-, Я тоже думаю о обещании, но я не знаю, как это сделать. – Kai

+0

Можете ли вы сделать 'console.log (response)' в своей '$ http.post'? Потому что это действительный код (я думаю), но вам нужно отправить обратно данные! – trichetriche

+0

моя ошибка! это хорошо, его работа (у меня был ответ на функцию (ошибка) .. большое спасибо! – Kai

0

Попробуйте использовать этот

.factory('AuthenticationService', 
['Base64', '$http', '$cookieStore', '$rootScope', 
function (Base64, $http, $cookieStore, $rootScope) { 
    var service = {}; 

    this.Login = function (username, password) { 

     var authdata = Base64.encode(username + ':' + password); 

     $rootScope.globals = { 
      currentUser: { 
       username: username, 
       authdata: authdata 
      } 
     }; 

     $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; 
     $cookieStore.put('globals', $rootScope.globals); 

     $http.post('http://localhost:8080/v1/login', { username: username, password: password }) 
      .success(function (response) { 
       return response; 
      }); 
    }; 

    this.ClearCredentials = function() { 
     $rootScope.globals = {}; 
     $cookieStore.remove('globals'); 
     $http.defaults.headers.common.Authorization = 'Basic '; 
    }; 
}]) 

контроллер

.controller('LoginController', 
['$scope', '$rootScope', '$location', 'AuthenticationService', 
function ($scope, $rootScope, $location, AuthenticationService) { 
    // reset login status 
    AuthenticationService.ClearCredentials(); 

    $scope.login = function() { 
     $scope.dataLoading = true; 
     var response = AuthenticationService.Login($scope.username, $scope.password); 
     if(response.success) { 
       $location.path('/'); 
      } else { 
       $scope.error= response.message; 
       $scope.dataLoading = false; 
      } 
    }; 
}]); 
+0

привет, если я изменить его, ClearCredentials не определено:/ – Kai

0

Нет необходимости производить обещание с $q.defer(), поскольку служба $ http уже возвращает обещание. Избегайте этого Q Defer Anti-Pattern.

//AVOID this $q.defer ANTI-PATTERN 
var deferred = $q.defer(); 

$http.post('http://localhost:8080/v1/login', { username: username, password: password }) 
    .then(function (response) { 
     deferred.resolve(response); 
    }, function(error) { 
     deferred.reject(error); 
    }); 

return deferred.promise; 

Вместо просто использовать обещание, что $ HTTP сервис возвращает:

//INSTEAD return promise from $http 

var promise = $http.post('http://localhost:8080/v1/login', { username: username, password: password }); 

return promise; 
Смежные вопросы