1

我使用navigator.geolocation.watchPositionangularJS 应用程序来找出当前位置洞察力。效果很好。现在我将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 }); 

}]);

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

在调试我发现的情况时,$scope.watchMyPositionChangesID返回后丢失 #/mainnavigator.geolocation再次调用,但导致超时。所以$scope.processNewLocation(data);不再调用,watchPosition结果超时(代码3)

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

所以没有新的位置对象可以成功获取。

我没有办法?!

//更新:如果我使用navigator.geolocation.clearWatch(id);.
问题是:如何确定id外部的watchPosMap-controller?我认为获取角度元素不是一个优雅的想法,对吧?我应该将 watchID 作为参数传递给新的路由/视图/控制器吗?

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

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

这是最佳做法吗?

4

0 回答 0