我正在使用角度js进行应用程序,其中,在控制器中,当它加载时,我尝试获取浏览器是否具有地理位置能力,如果是,我尝试获取位置。我的问题是视图在位置加载之前加载,因此视图为空。
我试图用工厂制作,在控制器的第一行内联,等等。我的问题是,如何配置工厂以获得位置,并在控制器中等待工厂返回位置以继续加载?
我的工厂:
.factory('geoLocator', function($http, $q){
var getPosition = function(){
navigator.geolocation.getCurrentPosition(function(posicion){
respuesta = {status: "ok", latitud: posicion.coords.latitude, longitud: posicion.coords.longitude};
}, function(objPositionError){
var respuesta = {status: "error", message: ""};
switch (objPositionError.code)
{
case objPositionError.PERMISSION_DENIED:
error.message = "No se ha permitido el acceso a la posición del usuario.";
break;
case objPositionError.POSITION_UNAVAILABLE:
error.message = "No se ha permitido el acceso a la posición del usuario.";
break;
case objPositionError.TIMEOUT:
error.message = "El servicio ha tardado demasiado tiempo en responder.";
break;
default:
error.message = "Error desconocido.";
}
return respuesta;
}, {
enableHighAccuracy: true,
maximumAge: 75000,
timeout: 50000
});
console.log("Respuesta: "+JSON.stringify(respuesta));
return respuesta;
};
var getIfActive = function(){
var active = false;
if(navigator.geolocation){
active = true;
}else{
active = false;
}
return active;
}
return {
getActive: getIfActive,
getCurrentPosition: getPosition
}
});
我也尝试过承诺,结果相同。
控制器:
.controller('AyudarCtrl', function($scope, $rootScope, $ionicLoading, $http, geoLocator) {
$scope.geoAccepted = geoLocator.getActive();
$scope.geoPosition = geoLocator.getCurrentPosition();
console.log($scope.geoPosition);
});
编辑:
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/')
$stateProvider.state('home', {
url: '/',
templateUrl: 'home.html'
})
.state('ayudar', {
url: '/ayudar',
templateUrl: 'ayudar.html',
controller: 'AyudarCtrl'
})
.state('recibir', {
url: '/recibir',
templateUrl: 'recibir.html',
controller: 'RecibirCtrl'
})
.state('agradecimientos', {
url: '/agradecimientos',
templateUrl: 'agradecimientos.html',
controller: 'AgradecimientosCtrl'
})
})
答案 0 :(得分:1)
您的控制器是否在路线后面?
如果是这样,您可以在使用工厂构建路径时使用resolve属性,并在承诺期间创建路径,以防止路由加载直到工厂完成。
如果控制器不在路径后面,那么在控制器中执行服务后,您必须包装所有逻辑。