在不同范围内使用变量angularJs

时间:2017-03-21 13:18:16

标签: javascript angularjs variables scope visibility

我在angularJs中有这个控制器

slice

conole.log给了我一个未定义的。我知道这对某人来说可能是一个显而易见的问题,但我该如何解决呢?

修改

抱歉,伙计们,我不太清楚:我需要在函数外部使用curPos var。一旦它被增强,我需要在控制器的每个地方读取它的值。

5 个答案:

答案 0 :(得分:0)

navigator.geolocation.getCurrentPosition 是一个异步,所以当你的成功函数被执行时,你的console.log(curPos)就会被执行,因此是未定义的。只需将console.log(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);
   };


})

答案 1 :(得分:0)

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

所以,移动你的逻辑,你正在使用的地方' curPos'变量,给你成功的回调功能。在那里,您将获得更新的' 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
})

这还取决于您需要处理的案例。

  1. 如果' curPos'的这个值被提取一次

    一个。 在应用启动时 - 然后在somoe家庭控制器或父/抽象控制器中获取此值并将其保存在某些工厂(共享数据服务)中,然后可以从任何工厂(共享数据服务)获取该工厂控制器,如果需要。

    在页面加载时 - 然后可以在使用anguler ui路由器状态并解析页面加载之前获取此信息。有关详细信息,请参阅http://www.jvandemo.com/how-to-resolve-angularjs-resources-with-ui-router/

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

答案 2 :(得分:0)

使用$scope.$apply更新范围,不使用Angular框架处理的异步方法。

这是一个有效的例子:

Plunker:https://plnkr.co/edit/xiv33CunDZrb06PvfFyU

<强>的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>

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我不确切知道为什么,但我最终只是通过使用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);

我必须将所有使用该var的代码放在success函数中。 谢谢大家:)