我在angularJs中有这个控制器
slice
conole.log给了我一个未定义的。我知道这对某人来说可能是一个显而易见的问题,但我该如何解决呢?
修改
抱歉,伙计们,我不太清楚:我需要在函数外部使用curPos var。一旦它被增强,我需要在控制器的每个地方读取它的值。答案 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
})
这还取决于您需要处理的案例。
如果' curPos'的这个值被提取一次:
一个。 在应用启动时 - 然后在somoe家庭控制器或父/抽象控制器中获取此值并将其保存在某些工厂(共享数据服务)中,然后可以从任何工厂(共享数据服务)获取该工厂控制器,如果需要。
湾在页面加载时 - 然后可以在使用anguler ui路由器状态并解析页面加载之前获取此信息。有关详细信息,请参阅http://www.jvandemo.com/how-to-resolve-angularjs-resources-with-ui-router/。
如果值需要时不时更新 - 在这种情况下,您必须将每个逻辑(使用此变量)移动到成功回调(可以实现多个根据逻辑的变化回调,这样你就可以明确地同步这个场景。
答案 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函数中。 谢谢大家:)