Javascript 在不同范围内使用变量angularJs
我有一个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
.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
})
这还取决于您需要处理的案例
使用
$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ò-请看我对这个答案的更新版本。下面是一个工作示例(我也更新了我的答案):