2014-10-17 2 views
2

Я пытаюсь напечатать список объектов, показывающих их имена и расстояние между его и местоположением пользователей. Я получаю данные через GET и вычисляю расстояние, основанное на широтах и ​​долготах. Тем не менее, длина моего массива scope остается 0. Я предполагаю, что что-то не так с моей архитектурой обратного вызова, но я не могу понять это.AngularJS: Обратные вызовы определены правильно?

Контроллер:

angular.module('ionicApp', ['ionic']).controller('objectCtrl', function($scope, $http) { 
$scope.objects = []; 
$http.get('http://url.com/getobjects.php').then(function (resp) { 
    for (var i = 0; i < resp.data.length; i++) { 
     getDistance(resp.data[i].lat, resp.data[i].lng, (function(index){ 
      return function(dist){ 
       $scope.objects[index] = { 
        name: resp.data[index].name, 
        distance: dist 
       }; 
      } 
     })(i)); 
    } 
}, function (err) { 
    console.error('ERR', err); 
    alert("error"); 
}); 

GetDistance:

function getDistance(lat2, lon2, callback) { 
    navigator.geolocation.getCurrentPosition(function onSuccess(position) { 
     var lat1 = position.coords.latitude; 
     var lon1 = position.coords.longitude; 
     var radlat1 = Math.PI * lat1/180; 
     var radlat2 = Math.PI * lat2/180; 
     var radlon1 = Math.PI * lon1/180; 
     var radlon2 = Math.PI * lon2/180; 
     var theta = lon1 - lon2; 
     var radtheta = Math.PI * theta/180; 
     var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); 
     dist = Math.acos(dist); 
     dist = dist * 180/Math.PI; 
     dist = dist * 60 * 1.1515; 
     dist = dist * 1.609344; 
     callback(dist); 
    }, function onError(error) { 
     alert("no location found:"+ error); 
    }); 
} 

Любые идеи, что случилось с моим кодом? Благодарю.

ответ

1

Похоже, getDistance Обратный звонок появляется из цикла $ digest. Таким образом, вы должны попытаться пнуть его вручную:

$scope.objects[index] = { 
    name: resp.data[index].name, 
    distance: dist 
}; 
$scope.$apply(); 

или с помощью $timeout услуги:

getDistance(resp.data[i].lat, resp.data[i].lng, (function (index) { 
    return function (dist) { 
     $timeout(function() { 
      $scope.objects[index] = { 
       name: resp.data[index].name, 
       distance: dist 
      }; 
     }); 
    } 
})(i)); 
+0

Какой один из них 2 является «лучшим» способом? Я теперь реализовал первый (отлично работает), поскольку я полагаю, что могу избежать определения дополнительной функции. Правильно ли мое предположение? Большое спасибо! – Tom

+0

Второй является более надежным, так как он не пытается запустить дайджест, пока предыдущий не будет выполнен. Таким образом, ошибка «$ digest is is progress progress» не будет. – dfsq

+1

Пожалуйста, не используйте '$ apply', это очень редко. Просто заверните 'navigator.geolocation.getCurrentPosition' с обещанием' $ q' и не потребуется $ apply/$ timeout. – Yoshi

0

Вместо

 $scope.objects[index] = { 
      name: resp.data[index].name, 
      distance: dist 
     }; 

Заменить

 $scope.objects.push({ 
      name: resp.data[index].name, 
      distance: dist 
     }); 
Смежные вопросы