не удалось получить доступ к объекту $ scope вне функции обратного вызова ответа http в angularjs

0

У меня есть этот контроллер для сохранения некоторых деталей для человека. У меня есть отдельный репозиторий EntityRepository, где определена функция для получения пол пользователя из базы данных.

Ответ функции работает правильно, и когда я печатаю пол на консоли внутри ответа функции, он работает (console.log("внутри:", $ scope.userGender);).

Но вне функции значение не определено undefined Я получаю (console.log("outside:", $ scope.userGender);)

.controller('individualDetailsCtrl', function($scope, $rootScope, $location, EntityRepository) {
 $scope.userGender = "";
 $scope.entity = {
   name: "",
   gender: $scope.userGender,
   dob: "",
   pan: ""
 };
 EntityRepository.getUserGender()
 .then(function(response){
   $scope.userGender = response.data.gender;
   console.log("inside : ", $scope.userGender);
 })
 .catch(function(errorResponse) {
   $scope.error = errorResponse.data
 });
 console.log("outside : ", $scope.userGender);
});

Я хочу сохранить пол из ответа в переменной $ scope.entity.gender, но я не могу получить доступ к значению $ scope.userGender вне области действия.

Поскольку $ scope определен в области контроллера, я думаю, что он должен иметь доступ к своим значениям вне ответа функции.

Теги:
angularjs-scope

3 ответа

1
Лучший ответ

Причина, по которой вы не можете получить доступ к значению $scope.userGender за пределами обратного вызова успеха AJAX, проста: AJAX является асинхронным, что означает, что значение этой переменной будет назначено только после того, как этот вызов AJAX завершится успешно. Вы должны адаптировать свой код так, чтобы он не зависел от значения $scope.userGender до того, как этот вызов AJAX преуспел. Если это значение привязано к некоторому элементу управления в разметке, то это не проблема, значение будет появляться с небольшой задержкой, когда значение будет получено с сервера.

  • 0
    так как я могу это исправить.
  • 0
    Что вы хотите исправить? В вашем коде нет ничего плохого. Вот как работает AJAX. Используйте переменную $scope.userGender внутри обратного вызова AJAX, а не снаружи. Адаптируйте свой код так, чтобы он работал, используя функции обратного вызова.
0

Вы не можете получить доступ к внешнему значению из-за асинхронного свойства запросов. Это просто означает, что это утверждение: console.log("outside: ", $scope.userGender); , выполняет выполнение до .then(function(){... }).

Исправления:

  1. Оберните внешний код внутри $timeout

.controller('individualDetailsCtrl', function($scope, $rootScope, $location, EntityRepository, $timeout) {

а также

$timeout(function() {console.log("outside: ", $scope.userGender)});

  1. Используйте значение $scope.userGender только внутри .then(function() { }).
0

Можете ли вы попробовать это.

  $scope.GetUserGender = function(){
 EntityRepository.getUserGender().then(function(response){
    $scope.userGender = response.data.gender;
    console.log("inside : ", $scope.userGender);
  }).catch(function(errorResponse) {
    $scope.error = errorResponse.data
  });     
}
  $scope.GetUserGender();   //

 console.log("outside : ", $scope.userGender);

Надеюсь, это сработает :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню