Javascript 在不同范围内使用变量angularJs

Javascript 在不同范围内使用变量angularJs,javascript,angularjs,variables,scope,visibility,Javascript,Angularjs,Variables,Scope,Visibility,我有一个angularJs的控制器 .controller('MapCtrl', function($scope, $http, $rootScope) { $scope.mappa={}; var curPos; if (navigator.geolocation) navigator.geolocation.getCurrentPosition(success); function success(pos) { var crd = pos.co

我有一个angularJs的控制器

.controller('MapCtrl', function($scope, $http, $rootScope) {
  $scope.mappa={};
  var curPos;

  if (navigator.geolocation)
      navigator.geolocation.getCurrentPosition(success);

    function success(pos) {
      var crd = pos.coords;
      curPos = crd.latitude;
    };

    console.log(curPos);
})
conole.log给了我一个未定义的。我知道这对某些人来说可能是一个显而易见的问题,但我如何才能解决这个问题呢

编辑


抱歉,伙计们,我不是很清楚:我需要在函数之外使用curPos变量。一旦它被增强,我需要在控制器的任何地方读取它的值。

navigator.geolocation.getCurrentPosition是同步的,因此在执行成功函数时,您的console.log(curPos)正在执行,因此未定义。只需将console.log(curPos)放在success函数中即可

.controller('MapCtrl', function($scope, $http, $rootScope) {
   $scope.mappa={};
   var curPos;

  if (navigator.geolocation)
  navigator.geolocation.getCurrentPosition(success);

   function success(pos) {
      var crd = pos.coords;
      curPos = crd.latitude;
      console.log(curPos);
   };


})

我假设“getCurrentPosition”是某种服务调用,因此您的成功回调是异步调用的(在服务返回承诺之后)

因此,将使用“curPos”变量的逻辑移到success回调函数。在这里,您将获得更新后的“curPos”值

.controller('MapCtrl', function($scope, $http, $rootScope) {
    $scope.mappa = {};
    var curPos;

    if (navigator.geolocation)
        navigator.geolocation.getCurrentPosition(success);

    function success(pos) {
        var crd = pos.coords;
        curPos = crd.latitude;
        console.log(curPos); // would be a defined value here
        // your logic goes here
    };

    console.log(curPos); // would be undefined as it is being called before the execution of success call back function
})
这还取决于您需要处理的案例

  • 如果“curPos”的此值提取一次

    a在应用程序启动时-然后在somoe home controller或父/抽象控制器中获取该值,并将其保存在某个工厂(共享数据服务),然后可以根据需要从任何控制器获取该值

    b在页面加载时-然后可以在页面加载之前使用anguler ui路由器状态和解析获取。有关更多详细信息,请参阅

  • 如果该值需要不时更新-在这种情况下,您必须将您的每个逻辑(使用此变量)移动到成功回调(可以根据逻辑的变化实现多个回调),这样您就可以显式地同步此场景


  • 使用
    $scope.$apply
    以Angular framework不处理的异步方法更新范围

    以下是一个工作示例:

    普朗克:

    script.js

    angular.module('app', []);
    
    angular.module('app').controller('SampleController', function ($scope) {
        var ctrl = this;
    
        if (navigator.geolocation) {
          navigator.geolocation.getCurrentPosition(
              // On success
              function(pos) {
                console.log(pos)
                $scope.$apply(function() {
                    $scope.coords = pos.coords;
                })
              }, 
              // On error
              function(err) {
                console.error(err)
              }
          );
        }
    });
    
    index.html

    <html lang="en" ng-app="app">
    <head>
      <meta charset="utf-8">
      <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.min.js"></script>
      <script src="scripts.js"></script>
    </head>
    
    <body ng-controller="SampleController as ctrl">
    
    <p>
        latitude: {{coords.latitude}} <br/>
        longitude: {{coords.longitude}} <br/>
    </p>
    
    </body>
    </html>
    

    
    
    纬度:{{coords.latitude}}
    经度:{{coords.longitude}}


    由于这是一个异步过程,如果您在不等待getCurrentPosition成功的情况下打印var,它将是未定义的。您必须在此回调后(或在回调内)打印它。此外,如果您想访问这个var,首先必须检查它是否已定义,如果未定义,则等待它。您可以使用angular$timeout和var在var准备就绪时打印控制台。

    我不知道确切原因,但我最终仅通过使用
    angular.copy使其工作

        var curPos = {};
    
          navigator.geolocation.getCurrentPosition(function(pos) {
            var tmpPos = {
                      lat: pos.coords.latitude,
                      lng: pos.coords.longitude
            }
    
            angular.copy(tmpPos, curPos);
          });
    
          console.log(curPos);
    
    我必须将所有使用该变量的代码放入success函数中。
    感谢大家:)

    由于您使用的是异步函数,因此无法像以前那样打印
    curPos
    。请参阅可能重复的感谢,但我需要在控制器中的所有位置使用
    curPos
    ,而不仅仅是在成功函数中:(与前面的注释相同,我需要知道
    curPos
    的值,不仅是在成功函数中,而且是在控制器中的所有位置:(@DavidePisanò-请看我对这个答案的更新版本。下面是一个工作示例(我也更新了我的答案):