Angular JS和navigator.getPosition - 等到获得位置

时间:2016-04-14 16:51:01

标签: javascript angularjs geolocation

我正在使用角度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'
  })
})

1 个答案:

答案 0 :(得分:1)

您的控制器是否在路线后面?

如果是这样,您可以在使用工厂构建路径时使用resolve属性,并在承诺期间创建路径,以防止路由加载直到工厂完成。

如果控制器不在路径后面,那么在控制器中执行服务后,您必须包装所有逻辑。