【问题标题】:Loading address data into google maps from database using Angularjs使用Angularjs将地址数据从数据库加载到谷歌地图中
【发布时间】:2017-09-28 05:18:09
【问题描述】:

我正在为我的应用程序使用 angularjs。我正在尝试从数据库中的 user_address 表中加载地址并在加载时将其显示在地图上。

这是我用来加载谷歌地图的脚本

    <script async defer src="https://maps.googleapis.com/maps/api/js?
    key=myKey&callback=initMap">
    </script>

这里是html

    <div id="map"></div>
    <div id="repeatmap" data-ng-repeat="marker in markers | orderBy :
    'title'">
    <a id="country_container" href="#" ng-
    click="openInfoWindow($event, marker)">
    <label id="namesformap" >{{marker.title}}</label></a>
    </div>

这是 Controller.js

    var DirectoryController = function($scope, $rootScope, $http,
    $location, $route,DirectoryService,HomeService,$routeParams) 
    {

    $scope.getAllCities = function()
    {
        DirectoryService.getAllCities().then(function(response){
        $scope.cities = response.data;
        console.log($scope.cities);
    })
    }

    var mapOptions = {
        zoom: 4,
        center: new google.maps.LatLng(25,80),
        mapTypeId: google.maps.MapTypeId.TERRAIN
    }

    $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.city
     });
     marker.content = '<div class="infoWindowContent">' + info.desc +
     '</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 (var i = 0; i < $scope.cities.length; i++){
        createMarker($scope.cities[i]);
    }

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

在 getAllCities 函数中,我从数据库中得到所有城市名称的响应。

正如您在控制台中看到的那样,我能够从数据库中获取响应,但我无法将 $scope.cities 值获取到 for 循环。它说无法读取未定义的属性“长度”。谁能告诉我如何我可以将 $scope.cities 的值放入 for 循环中,以便在地图中我可以显示从数据库返回的城市。现在我可以显示地图但没有城市和标记。我不知道它是否会工作我做错了吗?

【问题讨论】:

  • 由于来自数据库的请求可能是异步的,因此在您尝试添加标记之前,可能尚未解决响应。尝试等待设置地图,直到您的数据得到解析(即从then-callback 调用您的地图设置代码)。
  • 你能详细说明一下吗?现在我从数据库中得到所有城市的响应
  • Controller.jssn-p 中显示的所有代码放入一个函数中(我无法从您共享的代码中判断您是否已经这样做了)。从then-函数中调用该函数。如果还不够清楚,我要求您在 sn-ps 中添加更多代码,以便查看执行此代码的上下文。
  • 我必须将它放在 getAllCities .then 回调中吗?
  • 我已经更新了我的问题。我已经添加了我正在使用的整个控制器

标签: javascript angularjs google-maps


【解决方案1】:

这很可能是因为您试图在对数据库的请求完成解析之前添加标记。发生这种情况是因为数据库/Web 服务请求很可能是异步执行的。

当您来自数据库请求的承诺已解决时,请运行代码来设置标记。像这样:

var DirectoryController = function($scope, $rootScope, $http, $location, $route,DirectoryService, HomeService, $routeParams) 
{
    $scope.getAllCities = function()
    {
        DirectoryService.getAllCities().then(function(response){
            $scope.cities = response.data;
            console.log($scope.cities);
            setupMapMarkers();
        });
    }

    function setupMapMarkers(){
        var mapOptions = {
            zoom: 4,
            center: new google.maps.LatLng(25,80),
            mapTypeId: google.maps.MapTypeId.TERRAIN
        }

        $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions);
        $scope.markers = [];
        var infoWindow = new google.maps.InfoWindow();

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

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

    function createMarker(info){
        var marker = new google.maps.Marker({
            map: $scope.map,
            position: new google.maps.LatLng(info.lat, info.long),
            title: info.city
        });
        marker.content = '<div class="infoWindowContent">' + info.desc + '</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);
    }  
}

【讨论】:

  • 我试过这个代码。但是地图本身没有显示
  • 这可能是一个完全不同的问题。您是否在控制台中遇到任何错误?
  • 没有错误。只是显示为空。以前它正在加载谷歌地图。
  • 显示initMap不是函数
  • 这个问题有点超出了原始问题的范围——我认为这已经解决了?这个切题的问题如果不亲自坐在代码中就有点难以回答,你能不能用最小的样本来制作一个 Plunker 或类似的东西来显示这个新问题?
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多