简体   繁体   English

Google Map API加载动态信息窗口

[英]Google Map API loading dynamic info windows

I have google maps loading locations from my database dynamically on the map. 我有谷歌地图在我的数据库中动态地在地图上加载位置。 The problem is its not displaying each locations correct display information. 问题是它没有显示每个位置正确的显示信息。 Its only showing information from the last product on all the markers. 它仅显示所有标记上最后一个产品的信息。 I need to iterate through each marker somehow. 我需要以某种方式迭代每个标记。 My code is below: 我的代码如下:

<section class="content jumbotron jumbotron-full-height">
    <div class="item slide-1">
        <div id="home-map"></div>
    </div>
</section>

<script>
    var map;
    function initMap() {

        map = new google.maps.Map(document.getElementById('home-map'), {
            center: {lat: 52.1326, lng: 5.2913},
            zoom: 6,
            mapTypeId: 'roadmap',
            styles: [
                {
                    featureType: 'all',
                    stylers: [
                        { saturation: 0 }
                    ]
                },{
                    featureType: 'road.arterial',
                    elementType: 'geometry',
                    stylers: [
                        { hue: '#00ffee' },
                        { saturation: 0 }
                    ]
                },{
                    featureType: 'poi.business',
                    elementType: 'labels',
                    stylers: [
                        { visibility: 'off' }
                    ]
                },{
                    featureType: 'road',
                    elementType: 'labels',
                    stylers: [
                        { visibility: 'on' }
                    ]
                }
            ]
        });

        {% for product in products %}
            var contentString = '<div class="info-window">'+
                                    '<div id="siteNotice">'+
                                    '</div>'+
                                    '<div id="window-content">'+
                                        '{% set path = product.image is not null ? product.image.path|imagine_filter(filter|default('sylius_shop_map_thumbnail')) : 'http://placehold.it/200x200' %}'+
                                        '<img src="{{ path }}" />'+
                                        '<h1>{{ product.code }}</h1>'+
                                    '</div>'+
                                    '<h2>{{ product.city }} - {{ product.country }}</h2>'+
                                    '<p><strong> Description: </strong>{{  product.shortDescription }}</p>'+
                                    '<p><strong> Price: </strong>from {{ product.price|sylius_price }} a day.</p>'+
                                    '<a class="btn btn-primary" href="{{ path("sylius_shop_product_show", {"slug": product.slug}) }}">more info</a>'+
                                '</div>';

            var infowindow = new google.maps.InfoWindow({
                content: contentString,
                maxWidth: 600
            });

            var marker = new google.maps.Marker({
                position: {lat: {{ product.latitude }}, lng: {{ product.longitude }}},
                map: map,
                title: '{{ product.city }}',
                label: '{{ product.address }}'
            });
            marker.addListener('click', function() {
                infowindow.open(map, marker);
            });
        {% endfor %}
    }
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC1c34AXAQ5Y3yV43Alj_ieMRaDPb0qZ44&callback=initMap" async defer>
</script>

The problem is you are not setting its content dynamically. 问题是您没有动态设置其内容。 To do so you have to create marker from another function 为此,您必须从另一个函数创建标记

  <section class="content jumbotron jumbotron-full-height">
        <div class="item slide-1">
            <div id="home-map"></div>
        </div>
    </section>

    <script>
        var map,infowindow;
        function initMap() {

            map = new google.maps.Map(document.getElementById('home-map'), {
                center: {lat: 52.1326, lng: 5.2913},
                zoom: 6,
                mapTypeId: 'roadmap',
                styles: [
                    {
                        featureType: 'all',
                        stylers: [
                            { saturation: 0 }
                        ]
                    },{
                        featureType: 'road.arterial',
                        elementType: 'geometry',
                        stylers: [
                            { hue: '#00ffee' },
                            { saturation: 0 }
                        ]
                    },{
                        featureType: 'poi.business',
                        elementType: 'labels',
                        stylers: [
                            { visibility: 'off' }
                        ]
                    },{
                        featureType: 'road',
                        elementType: 'labels',
                        stylers: [
                            { visibility: 'on' }
                        ]
                    }
                ]
            });

             infowindow = new google.maps.InfoWindow({
                    maxWidth: 600
                });

            {% for product in products %}
                createMarker(product )
            {% endfor %}
        }

       function createMarker(product){

        var contentString = '<div class="info-window">'+
                                        '<div id="siteNotice">'+
                                        '</div>'+
                                        '<div id="window-content">'+
                                            '{% set path = product.image is not null ? product.image.path|imagine_filter(filter|default('sylius_shop_map_thumbnail')) : 'http://placehold.it/200x200' %}'+
                                            '<img src="{{ path }}" />'+
                                            '<h1>{{ product.code }}</h1>'+
                                        '</div>'+
                                        '<h2>{{ product.city }} - {{ product.country }}</h2>'+
                                        '<p><strong> Description: </strong>{{  product.shortDescription }}</p>'+
                                        '<p><strong> Price: </strong>from {{ product.price|sylius_price }} a day.</p>'+
                                        '<a class="btn btn-primary" href="{{ path("sylius_shop_product_show", {"slug": product.slug}) }}">more info</a>'+
                                    '</div>';


                var marker = new google.maps.Marker({
                    position: {lat: {{ product.latitude }}, lng: {{ product.longitude }}},
                    map: map,
                    title: '{{ product.city }}',
                    label: '{{ product.address }}'
                });
                marker.addListener('click', function() {
                    infowindow.setContent(contentString);
                    infowindow.open(map, marker);
                });
       }


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

Be sure to declare infowindow as a global variable 一定要将infowindow声明为全局变量

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM