2014-08-31 8 views
2

Я использую API Карт Google, чтобы получить расстояние между двумя точками. Этот метод использует функцию обратного вызова. Проблема в том, что этот код находится внутри Угловой службы, которую я хочу вызвать из контроллера, чтобы контроллер мог выводить результаты в область видимости. Но я понятия не имею, как служба может вернуть полученные больницы [] массив объектов для контроллера. Как я могу это сделать?Обратный звонок внутри Угловой службы - как вернуть данные контроллеру

myAppServices.service('NearestHospitalService', function(){ 
function calculateDistances() { 
     var service = new google.maps.DistanceMatrixService(); 
     var hospitals = []; 
     service.getDistanceMatrix(
     { 
      origins: [origin1], 
      destinations: [destinationA, destinationB], 
      travelMode: google.maps.TravelMode.DRIVING, 
      unitSystem: google.maps.UnitSystem.METRIC, 
      avoidHighways: false, 
      avoidTolls: false 
     }, callback); 

    } 

function callback(response, status) { 
     if (status != google.maps.DistanceMatrixStatus.OK) { 
      alert('Error was: ' + status); 
     } 
     else { 
      var origins = response.originAddresses; 
      var destinations = response.destinationAddresses; 
      var results = response.rows[0].elements; 
      for (var j = 0; j < results.length; j++) { 
       hospitals.push(new hospital(destinations[j], results[j].distance, results[j].duration)); 
      } 
      hospitals.sort(compareDistance); 
     } 
    } 
}); 

ответ

4

Я добавлю какой-нибудь код в формате psuedo, чтобы вы попали в правильном направлении. В основном с обратными вызовами вы должны иметь обратные вызовы, вплоть до того, где вы хотите, чтобы ваша ценность была пользователем.

У AngularJS есть модуль будущего/обещания для этого, также называемый $ q. Я не буду использовать это, но вы должны взглянуть на него.

myAppServices.service('NearestHospitalService', function(){ 
    var api = {}; 
    api.calculateDistances = function(callBack) { 
    var service = new google.maps.DistanceMatrixService(); 
    service.getDistanceMatrix(
    { 
     origins: [origin1], 
     destinations: [destinationA, destinationB], 
     travelMode: google.maps.TravelMode.DRIVING, 
     unitSystem: google.maps.UnitSystem.METRIC, 
     avoidHighways: false, 
     avoidTolls: false 
    }, extractResult); 

    function extractResult(response, status) { 
     ... do computations on you response ... 
     callback(transformedResponse); 
    } 
    }; 

    return api; 
}); 

Вы тогда называть это так:

$scope.distances = []; 
NearestHospitalService.calculateDistances(function(ds) { $scope.distances = ds; }); 

Другой способ мог бы придать $ rootScope и использовать трансляцию, если у вас есть несколько компонентов, в вашем коде, которые нужно знать о чем-то, что уже было обновлены, чтобы они могли извлечь то, что им нужно.

В этом случае вы кэшировать ответ в службе

myAppServices.service('NearestHospitalService', ['$rootScope', function($rootScope){ 
    var api = {}; 
    api.distances = []; 
    api.calculateDistances = function() { 
    var service = new google.maps.DistanceMatrixService(); 
    service.getDistanceMatrix(
    { 
     origins: [origin1], 
     destinations: [destinationA, destinationB], 
     travelMode: google.maps.TravelMode.DRIVING, 
     unitSystem: google.maps.UnitSystem.METRIC, 
     avoidHighways: false, 
     avoidTolls: false 
    }, extractResult); 

    function extractResult(response, status) { 
     ... once again calculate ... 
     api.distances = transformedResult; 
     $rootScope.$broadcast('updatedDistances'); // you could also send distances as an argument directly if you wanted to. 
    } 
    }; 

    return api; 
}]); 

Тогда вы должны слушать радиопередачи и получать кэш.

$rootScope.$on('updatedDistances', function(event) { $scope.distances = NearestHospitalService.distances }); 
+0

Благодарим за помощь Магнуса! У меня есть быстрый вопрос - что такое var api = {} и почему вы его возвращаете? – bjornasm

+0

Это делает его объектом с функциями. В вашем примере не было никакого возвращаемого значения из службы вообще. – Magnus

+0

Спасибо. Как насчет функции (ds) в контроллере, что такое ds? – bjornasm

Смежные вопросы