使用ngroute,watchPosition无法正常工作(超时,代码3)

时间:2014-07-22 13:35:34

标签: angularjs geolocation timeout angularjs-ng-route

我使用navigator.geolocation.watchPosition找出angularJS应用程序的当前位置。这很好用。 现在我在页面中添加了ngRoute功能。

启动应用程序会将用户重定向到#/main,其中控制器获取当前位置,并在地图上显示此位置。 那仍然有效。 这是控制器:

MyMapCtrl.controller('watchPosMap', ['$scope', 'MarkerService', function($scope) {
    $scope.ha = true;
    $scope.timeout = 20000;

    $scope.processNewLocation = function (data) {
                 [..code to process an display the location ...]
    };

    $scope.watchMyPositionChangesID = 
        navigator.geolocation
                  .watchPosition(
                      function(data) {
                          $scope.processNewLocation(data);
                      },
                      function(e){
                          $scope.errorMsg = e;
                          if (e.code == 2)
                          {alert('Unable to detect location');}

                      },
                      { enableHighAccuracy: true,timeout: $scope.timeout }); 

}]);

问题是:如果应用程序转到不同的路径(例如从#/main#/detail)而不是回到主路径,则会显示地图,但地理位置接缝不起作用。 行$scope.processNewLocation(data)不再执行。

在调试我发现的情况时,$scope.watchMyPositionChangesID在返回#/main后丢失,再次调用navigator.geolocation,但会导致超时。因此$scope.processNewLocation(data);不再被调用,watchPosition导致超时(代码3)

http://dev.w3.org/geo/api/spec-source.html#position_error_interface

因此无法成功获得新的位置对象。

我不知道怎么办?!

//更新: 如果我使用navigator.geolocation.clearWatch(id);删除“geolocation-watch-objekt”,它会接缝起作用。
问题是:如何确定id - 控制器外的watchPosMap?我认为取出角度元素不是一个优雅的想法,对吧?我应该将watchID作为参数传递给新路由/视图/控制器吗?

//更新2: 我向watchPosMap - 控制器添加了一个$routeChangeStart侦听器,以便在路由发生更改时删除watchPosition对象。

$scope.$on('$routeChangeStart', function(next, current) { 
    navigator.geolocation.clearWatch($scope.watchMyPositionChangesID);
});

这是最佳做法吗?

0 个答案:

没有答案