ArtMavir
@ArtMavir

Почему не виден(undefined) массив объектов в методе?

Есть такой код:
chill.controller('messagesController', function($scope, $http, $rootScope, $location, $stateParams, $ionicSlideBoxDelegate, $ionicLoading) {

	if ($rootScope.userData != undefined) {
		$ionicLoading.show({
			template: 'loading'
		})
		$http.get('http://site/api/v1/messages/index/id_user/'+$rootScope.userData.id_user+'/id_contact/'+$stateParams.id)
		.success(function(data)	{
			$scope.messages = data;
			for (var i = 0; i < $scope.messages.response.length; ++i) {
				if ($scope.messages.response[i].type == 'location') {
					var strings = $scope.messages.response[i].content.split(' ');
					var lat1 = strings[0], lat2 = strings[1];
					$http.get('http://maps.googleapis.com/maps/api/geocode/json?latlng='+lat1+','+lat2+'&sensor=false')
					.success(function(data)	{
						$ionicLoading.hide();
						$scope.messages.response[i].address = data.results[0].formatted_address;
					});
				};
			};
			$ionicSlideBoxDelegate.update();
		});
	}
	else
	{
		$location.path('/login');
	};
});


Вопрос. Почему не виден(undefined) массив объектов $scope.messages в .success(function(data){} ?
Спасибо.
  • Вопрос задан
  • 2366 просмотров
Пригласить эксперта
Ответы на вопрос 3
@FireGM
success выполняется только в случае удачного выполнения $http.get. Вы на ошибку сделайте алерт. Поможет.
Ответ написан
keksmen
@keksmen
Just a programmer
Предлагаю объявить все переменные модели заранее (тем же null).
Данные от этого быстрее не появятся, зато ошибки "не найден такой-то ключ в объекте scope" исчезнут навсегда.
Ответ написан
Комментировать
@sdo
Кажется вот здесь нужная вам обработка

Вам правильно говорили в предыдущем решении - код поделен на несколько контекстов исполнения. То, что доступно в одном контексте, не видно в другом. Решение - либо пробрасывать необходимый вам объект в контекст после завершения get явно (но я не знаю можно ли и как это сделать в ангуляре, надо тестить на простых примерах сначала, я с ангуляром не работал), либо делать запросы асинхронными, так чтобы явно ждать когда каждый исполнится по очереди, и последовательно обрабатывать их результаты - тогда будет один последовательный контекст исполнения. Последний вариант работает понятнее, но дольше. Первый подразумевает что массив может некоторое время быть в подвешенном состоянии - половина запросов исполнилась и проставила доп. инфу в соответствующие объекты, а половина еще в процессе получения данных. В тоже время (так как контекстов исполнения несколько, и они работают одновременно) "главный" контекст, которому и нужен был массив с заполненными данными, также теоретически может попытаться начать работу с этим массивом, поэтому его нужно как-то ограничивать или проверять все ли запросы завершены.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час