好吧,我现在正在努力解决这个问题
http://plnkr.co/edit/AjNTek2EiiAwQUsfP5XQ?p=preview
app.controller('MainCtrl', function($scope, $q, $window) {
function getPosition() {
var deferred = $q.defer();
if ($window.navigator.geolocation) {
$window.navigator.geolocation.watchPosition(function(position) {
deferred.resolve(position);
});
}
return deferred.promise;
}
$scope.homePosition = {
coords: {
latitude: 22,
longitude: 25
}
};
var promise = getPosition();
$scope.showDistance = function(pos, homePosition) {
var position = {
lat: pos.coords.latitude,
lon: pos.coords.longitude
};
var homePosition = {
lat: homePosition.coords.latitude,
lon: homePosition.coords.longitude
};
/** Converts numeric degrees to radians */
function getDistance(lat1, lon1, lat2, lon2) {
var R = 6371; // Radius of the earth in km
var dLat = (lat2 - lat1).toRad(); // Javascript functions in radians
var dLon = (lon2 - lon1).toRad();
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c; // Distance in km
return d;
}
if (typeof(Number.prototype.toRad) === "undefined") {
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
};
return getDistance(position.lat, position.lon, homePosition.lat, homePosition.lon);
};
$scope.s = function() {
$scope.$watch(function() {
return $scope.homePosition.coords.latitude;
}, function(newValue, oldValue) {
if (newValue) {
$scope.distance = $scope.showDistance($scope.position, $scope.homePosition);
}
})
}
promise.then(function(position) {
$scope.position = position;
$scope.distance = $scope.showDistance(position, $scope.homePosition);
$scope.s();
});
});
当观察者没有被解雇时,一切正常,当观察者被解雇时我得到一个lat2.toRad()不是一个函数(花了一段时间才发现...在chrome中我只得到undefined不是一个函数..谢谢Firebug准确)
让我怀疑发生了什么事return this*Math.pi/180
我说的有效吗? 如果有人会根据Angular或Javascript指出我在这里缺少什么 谢谢
答案 0 :(得分:1)
我认为你需要重新思考一下你的逻辑。你的代码中有许多问题,即使是Plunkr正在接受的问题,比如在showDistance方法中重新定义homePosition:
...
$scope.showDistance = function(pos, homePosition) {
...
// Here we define a new variable with the same name as our function's 2nd param
var homePosition = {
...
这不是问题的根本原因 - 我只是将其调出来,因为这些警告通常表明您会在Javascript中遇到麻烦。 Javascript有一个叫做“变量提升”的东西,基本上意味着无论你在函数的哪个位置定义一个var,当你进入函数时,实际都会在最顶层定义。如果您不允许这样做,这可能会产生非常不可预测的行为,并且使用相同名称的var重新定义函数参数是导致很多人绊倒的问题之一。
但是,你的根本原因并不简单。在这种情况下,调试器是你的朋友。我已经分叉你的Plnkr并略微修改它以添加一个调试器断点: http://plnkr.co/edit/6amCdnBYqmzlUXVO9buP?p=preview
如果您在点击此处时查看“本地人”面板,您会看到lat2是一个字符串。字符串对象不支持数学函数 - 您需要先将其转换为int或float。 :)