使用来自控制器的服务变量

时间:2015-09-07 11:53:48

标签: javascript ionic

我的应用程序使用离子有问题。在我的Service.js中,我有一个函数可以检索我的位置,并且在我的controller.js中我有一个功能,当我在我的html页面中按下按钮时,将用户发送到另一个页面。所以,当我按下一个按钮,在应用程序将我发送到另一个页面之前,我希望在我的service.js(地理位置)中启动该功能,并仅在地理定位成功时发送给我。

我该怎么做?

我以为我可以在service.js上保存一个变量。如果函数输入onSuccess,我保存变量= 1,如果函数输入错误,我保存变量= 0.但是我不知道如何在我的控制器上使用这个变量......

service.js:

.factory('position', function() {
    return{
    positioning : function(){
    var geocoder;
     geocoder = new google.maps.Geocoder();
  initialise = function() {

      navigator.geolocation.getCurrentPosition(onSuccess, onError, { enableHighAccuracy : true, timeout : 5000, maximumAge : 0}); 
    function onSuccess(position){


      myLatlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);  
    }
    function onError(error){
      alert('code: '    + error.code    + '\n' +
              'message: ' + error.message + '\n'); 
      cordova.plugins.settings.openSetting("open", function(){console.log("opened settings")},function(){console.log("failed to open nfc settings")});  
    } 

  }
  google.maps.event.addDomListener(window, 'load', initialise());

Controller.js:

.controller('MainCtrl', function($scope,$state, position) {
  $scope.mappa=function(){
      $state.go('tab.mappa');
    position.positioning();

  }
  $scope.dettagli=function(){
    $state.go('tab.dettagli');
    position.positioning();
  }
  $scope.strada=function(){
    $state.go('tab.strada');
    position.positioning();
  }
  $scope.segnalazioni=function(){
    $state.go('tab.segnalazioni');
    position.positioning();
  }
  $scope.SOS=function(){
    $state.go('tab.sos');
    position.positioning();
  }

html页面:

<ion-view view-title="Home" ng-controller="MainCtrl">
  <ion-content class="padding">
    <div >
    <!-- LA MIA POSIZIONE -->
        <div class="max-width width-forty">
            <button class="button button-full button-royal" ng-click="mappa()">
                <table>
                <tr><td><i class="fa fa-map fa-hx fa-inverse"></i></td></tr>
                <tr><td class="button-text-map-sos">La mia posizione</td></tr>
                </table>
            </button>
            </div>
.........
..........
.........

2 个答案:

答案 0 :(得分:1)

当您使用ui-router时,在配置模块中

,您可以使用返回承诺的服务检查位置,如果您有位置则查看地图,否则显示错误。

  .config(function($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise('/');
    $stateProvider.state('home', {
        url: '/',
        templateUrl: 'page1.html',
        controller: 'page1Ctrl'
      })
      .state('map-view', {
        url: '/map-view/:forceBad',
        templateUrl: 'page2.html',
        controller: 'page2Ctrl',
        resolve: {
          location: function(GeoLocation, $q, $stateParams) {
            return GeoLocation.getLocation($stateParams.forceBad)
              .then(function(_response) {
                return _response;
              }, function(_error) {
                alert('error getting location')
                return $q.reject("no location found");
              });
          }
        }
      });
  })

在示例控制器中,我们传递一个标志来强制一个坏的或好的位置,这样你就可以看到应用程序路由中的两个路径

  .controller('page1Ctrl', function($scope, $state) {
  // click a button either force bad result or get good result
    $scope.clicked = function(_forceBad) {
      alert('clicked with forceBad ' + _forceBad);
      $state.go('map-view', {
        forceBad: _forceBad
      });
    }
  })

在服务中,当forceBad设置为true

时,我们会返回错误
  .service('GeoLocation', function($state, $q) {
    return {
      /**
      * when passed true, the service will not return a location
      */
      getLocation: function(_forceBad) {
        var deferred = $q.defer();
        setTimeout(function() {

          if (_forceBad === "true") {
            return deferred.reject({
              type: 'error',
            });
          }
          return deferred.resolve({
            type: 'location',
            lat: 100,
            lng: -100
          })
        }, 200);
        return deferred.promise;
      }
    }
  })

See complete codePen Here

答案 1 :(得分:0)

主要问题似乎是您没有将position工厂注入MainCtrl控制器。

请仔细阅读Angular中的依赖注入:

评论后修改:

好的,我想我更了解你的问题。 做你想做的事情的好的和干净的方法是使用promises。 您的positioning函数应该返回一个承诺。这样,您的控制器就会知道是否找到了位置。

来自ngCordova$cordovaGeolocation工厂应该可以帮助您完成此操作(请参阅getCurrentPosition的示例)。

This tutorial可以帮助您,感谢“在您的应用中创建地图”部分。