AngularJs观察到为什么会发生这种情况

时间:2014-08-23 15:43:41

标签: javascript angularjs geolocation

好吧,我现在正在努力解决这个问题

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指出我在这里缺少什么 谢谢

1 个答案:

答案 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。 :)