У меня есть этот контроллер для сохранения некоторых деталей для человека. У меня есть отдельный репозиторий 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 определен в области контроллера, я думаю, что он должен иметь доступ к своим значениям вне ответа функции.
Причина, по которой вы не можете получить доступ к значению $scope.userGender
за пределами обратного вызова успеха AJAX, проста: AJAX является асинхронным, что означает, что значение этой переменной будет назначено только после того, как этот вызов AJAX завершится успешно. Вы должны адаптировать свой код так, чтобы он не зависел от значения $scope.userGender
до того, как этот вызов AJAX преуспел. Если это значение привязано к некоторому элементу управления в разметке, то это не проблема, значение будет появляться с небольшой задержкой, когда значение будет получено с сервера.
Вы не можете получить доступ к внешнему значению из-за асинхронного свойства запросов. Это просто означает, что это утверждение: console.log("outside: ", $scope.userGender);
, выполняет выполнение до .then(function(){... })
.
Исправления:
$timeout
.controller('individualDetailsCtrl', function($scope, $rootScope, $location, EntityRepository, $timeout) {
а также
$timeout(function() {console.log("outside: ", $scope.userGender)});
$scope.userGender
только внутри .then(function() { })
.Можете ли вы попробовать это.
$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);
Надеюсь, это сработает :)
$scope.userGender
внутри обратного вызова AJAX, а не снаружи. Адаптируйте свой код так, чтобы он работал, используя функции обратного вызова.