在Twig中使用JS变量

时间:2014-04-29 08:06:39

标签: javascript symfony google-maps-api-3 twig

我需要在Twig中使用JS变量。

我已经找到this attempt并且我在下面的代码中尝试了它,但我没有工作,整个地图根本不会渲染。但是如果我删除" var polylineCoordinates"之间的部分呢?和" polyline.setMap(map);"。

我的任务是从转弯内的纬度/经度数据点绘制折线。

我在下面发布了地图的完整代码。

<script type="text/javascript">
        function initialize() {
               var mapOptions = {
                   center: new google.maps.LatLng({{ turn.pois[0].lat }}, {{ turn.pois[0].lon }}),
                   zoom: 9,
                   mapTypeId: google.maps.MapTypeId.ROADMAP
               };

               var map = new google.maps.Map(document.getElementById("map_canvas"),
               mapOptions);

               var i;
               var polylineCoordinates = new Array[];
               for (i = 0; i < {{ turn.pois }}; ++i) {
                   var lat = {{ turn.pois["PLACEHOLDER"].lat }};
                   var lon = {{ turn.pois["PLACEHOLDER"].lon }};
                   polylineCoordinates.push(new google.maps.LatLng(lat.replace("PLACEHOLDER", i), lon.replace("PLACEHOLDER", i)));
                   };
               var polyline = new google.maps.Polyline({
                   path: polylineCoordinates,
                   geodesic: true,
                   strokeColor: '#FF0000',
                   strokeOpacity: 1.0,
                   strokeWeight: 2
               });
               polyline.setMap(map);
               }

         google.maps.event.addDomListener(window, 'load', initialize);
</script>

此外,我真的很喜欢一般JS编码中的一些建议,如果有什么东西丢失或者我的代码可以改进,这对JS来说是个新手

修改

我现在使用以下

编辑了代码
var polylineCoordinates = [];                
for (i = 0; i < {{ turn.pois|length }}; ++i) {
                    var lat = {{ turn.pois[0].lat }};
                    var lon = {{ turn.pois[0].lon }};
                    polylineCoordinates.push(new google.maps.LatLng(lat.replace(0, i), lon.replace(0, i)));
                };

只是为了解释将来会看到这个问题的人:我需要在{{ turn.pois|length }}添加|长度,以便它与代表集合中所有元素的intiger进行比较#34;的POI&#34 ;.如果没有|长度过滤器,我会与收集/对象进行比较,这当然不会起作用。

此外,我需要删除&#34; PLACEHOLDER&#34; string因为在JS甚至开始运行之前很久就会解析Twig。所以我需要给出一个合法的默认值,比如[0]。 (集合中的第一个元素)

地图现在正在渲染,但没有折线。我猜测replace()不起作用。

EDIT2

如果我使用dummydata,我只是检查Polyline是否会绘制,所以我只是尝试了以下内容:

        var polylineCoordinates = [
            new google.maps.LatLng(54.180260, 12.098421),
            new google.maps.LatLng(54.180348, 12.198463),
            new google.maps.LatLng(54.256842, 12.324694),
            new google.maps.LatLng(54.328642, 12.468212)
        ];
        /*for (i = 0; i < {{ turn.pois|length }}; ++i) {
            var lat = {{ turn.pois[0].lat }};
            var lon = {{ turn.pois[0].lon }};
            polylineCoordinates.push(new google.maps.LatLng(lat.replace(0, i), lon.replace(0, i)));
        };*/

完美的工作!所以我的问题是用JavaScript中的i变量替换[0]的方法。如果需要,我也可以发布生成的JS代码!

1 个答案:

答案 0 :(得分:0)

为什么需要在Twig中使用js变量?它很脏,在你的情况下它是无用的。我建议在绘制多边形之前用ajax取出所有的coords。它会像:

 jQuery.ajax({
     url:    'http://example.com/getCoords',
     dataType: 'json'

     success: function(result) {
         //your array with coords;
         var polylineCoordinates = [];
                      console.log(result); //just to see what we have
                      $.each(result, function(i, item) {
                          polyineCoordinates = new google.maps.LatLng(item.lat, item.lng);
                      });
              },
     async:   false
});         

在此之后, - 你可以画画。