我使用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 });
}]);
问题是:如果应用程序转到不同的路线(例如 from #/main
to #/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);
.
问题是:如何确定id
外部的watchPosMap
-controller?我认为获取角度元素不是一个优雅的想法,对吧?我应该将 watchID 作为参数传递给新的路由/视图/控制器吗?
//更新 2:如果路由发生变化,我向watchPosMap
- 控制器添加了一个$routeChangeStart
侦听器,以便删除对象。watchPosition
$scope.$on('$routeChangeStart', function(next, current) {
navigator.geolocation.clearWatch($scope.watchMyPositionChangesID);
});
这是最佳做法吗?