web-dev-qa-db-ja.com

angularjsでHTML5ジオロケーションを使用するにはどうすればよいですか

AngularjsでHTML5ジオロケーションを使用するにはどうすればよいですか? HTML5を使用して取得できます。しかし、どのようにコントローラのanglejsスコープに渡すことができますか?サンプルjsfiddleは私の一日を節約します!

28
AngryJS

あなたは何かをすることができます

myApp.controller('fooCtrl', function($scope){
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position){
      $scope.$apply(function(){
        $scope.position = position;
      });
    });
  }
})

ジオロケーションが到着したときにダイジェストサイクルをトリガーし、すべてのウォッチャーを更新するには、$ scope。$ applyを実行する必要があります。

34

これをサービスに抽象化して、コントローラーがwindow.navigatorに依存しないようにし、不要な$ scope。$ apply()の使用を避けることをお勧めします。プロジェクトで使用しているものは次のとおりです。

angular.module('app', []).factory('geolocationSvc', ['$q', '$window', function ($q, $window) {

    'use strict';

    function getCurrentPosition() {
        var deferred = $q.defer();

        if (!$window.navigator.geolocation) {
            deferred.reject('Geolocation not supported.');
        } else {
            $window.navigator.geolocation.getCurrentPosition(
                function (position) {
                    deferred.resolve(position);
                },
                function (err) {
                    deferred.reject(err);
                });
        }

        return deferred.promise;
    }

    return {
        getCurrentPosition: getCurrentPosition
    };
}]);

次に、コントローラーで次のように使用します。

function captureUserLocation() {
    geolocationSvc.getCurrentPosition().then(onUserLocationFound);
}
64
Jared

ngGeolocation を使用できます。それは簡単で、仕事をします。

angular.module('appName', ['ngGeolocation'])
    .controller('appCtrl', function($scope, $geolocation) {
         $geolocation.getCurrentPosition().then(function(position) {
            console.log(position, 'current position');
         });
    });
2
Muhammad Reda

Firefoxの問題により、ユーザーが「今すぐ」、X、またはプロンプトボックスの外側( more here )をクリックしたときにWebサイトがあなたの場所にアクセスする必要があるというプロンプトを表示しないこの場合のフォールバックアクション。 Plunker

// GeoLocationService
angular.module('myApp').factory('GeoLocationService', function($q, $window, $timeout) {
    var factoryObj = {};

    factoryObj.getPosition = function() {
        var deferred;
        var promiseTimeout = $timeout(function() {
            deferred.reject(1); // return 1 if browser waited for user input for more than timeout delay
        }, 3000);

        deferred = $q.defer();

        if(!$window.navigator.geolocation) { // check if geoLocation is not supported by browser
            $timeout.cancel(promiseTimeout);
            deferred.reject(false); // return false if geoLocation is not supported
        }
        else { // geoLocation is supported
            $window.navigator.geolocation.getCurrentPosition(function(position) {
                $timeout.cancel(promiseTimeout);
                return deferred.resolve(position);
            }, function(error) {
                $timeout.cancel(promiseTimeout);
                return deferred.reject(error.code || 1);
            });
        }

        return deferred.promise;
    };

    return factoryObj;
});

そして、あなたのアプリjs。

// App
var app = angular.module('myApp', []).controller('myCtrl', function($scope, $log, GeoLocationService) {
    $scope.position = {};

    GeoLocationService.getPosition().then(
        function(position) { // 
            $scope.position = position;
            $log.debug(position);
        },
        function(errorCode) {
            if(errorCode === false) {
                alert('GeoLocation is not supported by browser.');
            }
            else if(errorCode == 1) {
                alert('User either denied GeoLocation or waited for long to respond.');
            }
        }
    );
});
0
Muhammad Reda