Angularjs: ReferenceError: функция не определена в Channel.onDeviceReady - PullRequest
0 голосов
/ 20 мая 2018

Это мой второй вопрос сегодня.Я использую Cordova + Angular (1).Я пытаюсь сравнить два геолокации с помощью функции distanceInKmBetweenCoordinates.

Я получаю эту ошибку при запуске приложения.

angular.min.js: 101 ReferenceError: distanceInKmBetweenCoordinates isне определено в Channel.onDeviceReady

Вот код.

document.addEventListener('deviceready', function onDeviceReady() {
            angular.bootstrap(document, ['formApp']);
        }, false);

        var formApp = angular.module('formApp', []);

// определение углового модуля / приложения

 var formApp = angular.module('formApp', []);

formApp.controller('formProfile1', function($scope,$http,$location, $timeout){

function degreesToRadians(degrees) {
    return degrees * Math.PI / 180;
}

function distanceInKmBetweenEarthCoordinates(lat1, lon1, lat2, lon2) {
    var earthRadiusKm = 6371;

    var dLat = degreesToRadians(lat2-lat1);
    var dLon = degreesToRadians(lon2-lon1);

    lat1 = degreesToRadians(lat1);
    lat2 = degreesToRadians(lat2);

    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    return earthRadiusKm * c;
}

Я использую геолокацию CordovaПлагин для получения текущего местоположения.

navigator.geolocation.getCurrentPosition(function(position) {
                    $scope.userlongitude = position.coords.longitude;

                    $scope.userlatitude = position.coords.latitude;

Ниже приведен некоторый ajax-запрос для получения данных из базы данных, включая геолокацию для сравнения.

$http({
                    url: 'https://www.abcd.xyz/get_info.php',
                    method: "GET",
                    params: {
                        tn_id: $scope.tn_id
                    }
                })
                .success(function(data) {

                    if (data.success) {
                          $scope.longitude = data.longitude;
                          $scope.latitude =  data.latitude;     
                    }
$scope.distance = distanceInKmBetweenCoordinates($scope.userlatitude, $scope.userlongitude, $scope.latitude, $scope.longitude);

В конце я сравниваюгеолокации.

Можете ли вы посоветовать мне, что я делаю не так?Если я просто делаю сравнение только по угловым значениям, то оно показывает мне правильное значение, но вместе с Кордовой оно не работает.

Я также внес изменения в раздел тела следующим образом.

<!--<body id="home" ng-app="formApp"> --> Previous one
  <body id="home">

Редактировать 1 Я изменил код следующим образом.

degreesToRadians = function(degrees) {
        return degrees * Math.PI / 180;
    }

     distanceInKmBetweenEarthCoordinates= function(lat1, lon1, lat2, lon2) {
        var earthRadiusKm = 6371;

        var dLat = degreesToRadians(lat2-lat1);
        var dLon = degreesToRadians(lon2-lon1);

        lat1 = degreesToRadians(lat1);
        lat2 = degreesToRadians(lat2);

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        return earthRadiusKm * c;
    }

    $scope.distance = distanceInKmBetweenEarthCoordinates(43, 44,44,55);
    alert($scope.distance);

, и когда я проверяю, он дает мне правильное значение, но когда я проверяю его таким образом.

distanceInKmBetweenCoordinates($scope.userlatitude, $scope.userlongitude, 44,55);

тогда это дает мне ту же ошибку.

Я использовал функцию $ timeout для задержки загрузки, но ошибка та же.

$timeout(function() {
                         $scope.distance = distanceInKmBetweenCoordinates($scope.userlatitude, $scope.userlongitude, 44,55);
                         alert($scope.distance);
                         console.log($scope.distance);

                         }, 5000);

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Попробуйте назначить функцию локальной переменной в области видимости контроллера, возможно, она теряет ссылку:

formApp.controller('formProfile1', function($scope,$http,$location){

var degreesToRadians = function(degrees) {
  return degrees * Math.PI / 180;
}

var distanceInKmBetweenEarthCoordinates = function(lat1, lon1, lat2, lon2) {
  var earthRadiusKm = 6371;

  var dLat = degreesToRadians(lat2-lat1);
  var dLon = degreesToRadians(lon2-lon1);

  lat1 = degreesToRadians(lat1);
  lat2 = degreesToRadians(lat2);

  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * 
    Math.cos(lat2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  return earthRadiusKm * c;
}
0 голосов
/ 20 мая 2018

Как вы предложили, поместите свой код, как только вы получите ответ от вызова ajax,

 if (data.success) {
       $scope.longitude = data.longitude;
       $scope.latitude =  data.latitude;     
       $scope.distance = distanceInKmBetweenCoordinates($scope.userlatitude, $scope.userlongitude, $scope.latitude, $scope.longitude);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...