【问题标题】:AngularJs and Google Maps Issue: Not displaying markers?AngularJs 和谷歌地图问题:不显示标记?
【发布时间】:2025-12-13 18:35:02
【问题描述】:

我正在尝试使用 AngularJs 和 Google Maps API 在地图上显示标记。但是,由于某种原因,我无法显示标记。我不确定我是否从数据库中提取了错误的数据,但如果有人可以帮助我,那就太好了!

.controller('MapCtrl', ['$scope', '$state', '$cordovaGeolocation', '$ionicSideMenuDelegate', '$ionicModal', 'LocationService', function($scope, $state, $cordovaGeolocation, $ionicSideMenuDelegate, $ionicModal, LocationService) {
    $scope.locations = [];

    LocationService.getLocations().then(function (result) {
      $scope.locations = result.data;
    });

    var mapOptions = {
        zoom: 4,
        center: new google.maps.LatLng(40.0000, -98.0000),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions);

    $scope.markers = [];

    var infoWindow = new google.maps.InfoWindow();

    var createMarker = function (info){

        var marker = new google.maps.Marker({
            map: $scope.map,
            position: new google.maps.LatLng(info.lat, info.long),
            title: info.name
        });

        marker.content = '<div class="infoWindowContent">' + info.name + '</div>';

        google.maps.event.addListener(marker, 'click', function(){
            infoWindow.setContent('<h2>' + marker.title + '</h2>' + marker.content);
            infoWindow.open($scope.map, marker);
        });

        $scope.markers.push(marker);

    }  

    for (i = 0; i < $scope.locations.length; i++){
        createMarker($scope.locations[i]);
    }

    $scope.openInfoWindow = function(e, selectedMarker){
        e.preventDefault();
        google.maps.event.trigger(selectedMarker, 'click');
    }
}])

.service('LocationService', function ($http, Backand) {
  var baseUrl = '/1/objects/';
  var objectName = 'locations/';

  function getUrl() {
    return Backand.getApiUrl() + baseUrl + objectName;
  }

  function getUrlForId(id) {
    return getUrl() + id;
  }

  getLocations = function () {
    return $http.get(getUrl());
  };

  return {
    getLocations: getLocations
  }
})

数据如何存储在数据库中

{
     "id": 1,
      "name": "Ballentine Hall",
      "lat": 39.165935,
      "long": -86.521287
}

【问题讨论】:

  • 如果您将console.log(info) 放入您的 createMarker 函数中,那么一次迭代的示例是什么样的?
  • 您的代码到jsfiddle 的这种无角度端口似乎有效 - 也许您应该检查您的数据?
  • 我认为你是对的,我没有得到数据。我尝试将 console.log(info) 放入 createMarker 函数中,但没有任何反应。但是,当我将console.log($scope.locations) 放在函数之外并得到一个空列表时

标签: javascript angularjs google-maps google-maps-api-3


【解决方案1】:

好吧,我让它工作了。很确定这不是正确/最有效的方法,但至少可以正常工作。

所以,我发现 createMarker 函数无法读取存储在位置变量中的数据。为了解决这个问题,我只是将地图的所有代码放在从数据库中获取位置数据的函数中。这样就解决了获取数据的问题。

第二个问题是它没有从位置获取正确的数据。因此,在getList 函数中,我将代码更改为:$scope.locations = response.data.data; 然后一切都开始工作了。

.controller('MapCtrl', ['$scope', '$state', '$cordovaGeolocation', '$ionicSideMenuDelegate', '$ionicModal', 'dataService', '$http', 'Backand', function($scope, $state, $cordovaGeolocation, $ionicSideMenuDelegate, $ionicModal, dataService, $http, Backand) {

  $scope.locations = [];

    dataService.getList('locations').then(function(response) {
    $scope.locations = response.data.data;

    var mapOptions = {
        zoom: 4,
        center: new google.maps.LatLng(40.0000, -98.0000),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions);

    $scope.markers = [];

    var infoWindow = new google.maps.InfoWindow();

    var createMarker = function (info){

        var marker = new google.maps.Marker({
            map: $scope.map,
            position: new google.maps.LatLng(info.lat, info.long),
            title: info.name
        });


        marker.content = '<div class="infoWindowContent">' + info.name + '</div>';

        google.maps.event.addListener(marker, 'click', function(){
            infoWindow.setContent('<h2>' + marker.title + '</h2>' + marker.content);
            infoWindow.open($scope.map, marker);
        });

        $scope.markers.push(marker);
    }  

 for (i = 0; i < $scope.locations.length; i++){
        createMarker($scope.locations[i]);
    }

    $scope.openInfoWindow = function(e, selectedMarker){
        e.preventDefault();
        google.maps.event.trigger(selectedMarker, 'click');
    } 
  });

【讨论】:

    【解决方案2】:

    您是否在调用 createMarker 函数时检查过是否将数据放入 $scope.locations 中。 使用console.log查看

     for (i = 0; i < $scope.locations.length; i++){
            console.log($scope.locations);
            createMarker($scope.locations[i]);
        }
    

    由于 javascript 的异步特性,它会转到下一行并执行程序,然后一旦你的 promise 解决它就会绑定数据。

    【讨论】:

    • 当我这样做时,控制台中没有显示任何内容。所以,我在循环之外尝试了console.log($scope.locations),我得到了一个空列表。所以,似乎我没有得到没有任何意义的数据,因为我在另一个控制器中使用了相同的功能并且我能够获取数据......
    • 在此状态被激活并调用控制器之前解析位置结果,或者在您成功调用 api 时调用您的 createmarkers fn。