2013-09-30 3 views
1

Есть ли что-то особенное, что мне нужно сделать для доступа к объектам внутри функций $ timeout?

Я получаю ошибки говорят маршруты неопределен, когда я пытаюсь и доступ к нему в функции $ таймаут, но вне функции $ таймаута (где лог консоли) он регистрирует объект и все в нем, как и ожидалось:

$scope.drawRoutes = function(routes) { 
    console.log(routes); 
    for (var i = 0; i < routes.length; i++) { 
    $timeout(function() { 
     MapService.directionsService.route(routes[i], function(response, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       MapService.direction_renderers.push(new google.maps.DirectionsRenderer()); 
       MapService.direction_renderers[MapService.direction_renderers.length - 1].setMap(MapService.gmaps.map); 
       MapService.direction_renderers[MapService.direction_renderers.length - 1].setDirections(response); 
       $scope.connectors_created += 1; 
       $scope.$digest(); 
      } 
     }); 
    }, 1000); 
    } 
}; 

ответ

5

Здесь проблема является переменным закрытием использования i внутри функций обратного вызова тайма-аута ... внутри каждого экземпляра обратного вызова i относится к одному экземпляру укупорочного ... так что, когда происходит выход из цикла i имеет значение routes.length, что приводит к доступ к routes[routes.length] в callbak, который будет неопределенным.

Предполагая route S является массив объектов, вы можете использовать функцию итератора Foreach(), чтобы решить проблему

$scope.drawRoutes = function (routes) { 
    console.log(routes); 
    angular.forEach(routes, function (route, idx) { 
     $timeout(function() { 
      MapService.directionsService.route(route, function (response, status) { 
       if (status == google.maps.DirectionsStatus.OK) { 
        MapService.direction_renderers.push(new google.maps.DirectionsRenderer()); 
        MapService.direction_renderers[MapService.direction_renderers.length - 1].setMap(MapService.gmaps.map); 
        MapService.direction_renderers[MapService.direction_renderers.length - 1].setDirections(response); 
        $scope.connectors_created += 1; 
        $scope.$digest(); 
       } 
      }); 
     }, (idx + 1) * 1000); 
    }) 
}; 
+0

Спасибо, что сделал это. Я также понял, что мой подход не имеет смысла. Я пытаюсь сделать новый маршрут каждые 1 секунду, но мой подход ждет 1 секунду, а затем отображает все из них, потому что все таймауты вызывают в течение миллисекунд eachother :-( – andro1d

+0

@ andro1d в этом случае попробуйте обновление –

+0

Еще раз спасибо , ты чемпион! :-) – andro1d

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