我使用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);
});
这是最佳做法吗?