Переменная JavaScript, не оцениваемая в Jekyll include

#javascript #jekyll #leaflet

#javascript #jekyll #брошюра

Вопрос:

Я создаю макет веб-карты для Jekyll на основе сообщения в блоге, хотя я использую Leaflet.js вместо Mapbox.js .

В начале сообщения маркеры определяются как список массивов. Формат следующий:


[ "lng, lat", "Popup Content", "Font-awesome Icon", "Color of Marker"]

Два маркера могут выглядеть следующим образом:


markers:
- ["-84.312, 33.845", "Regional Office", "home", "red"]
- ["-84.393, 33.753", "Federal Building", "building", "blue"]

Я беру параметры из маркера и добавляю их в представление GeoJSON в качестве свойств. Чтобы использовать Leaflet.awesome-markers, каждый элемент должен быть представлен в виде слоя маркеров вместо слоя GeoJSON. К счастью, слой GeoJSON предоставляет метод для преобразования каждой точки в слой маркеров.

Кажется, что, хотя у меня есть доступ к функции (и, следовательно, к свойствам функций), я не могу заставить переменную feature.properties.icon оценивать. После того, как Jekyll работает по волшебству и создает статические HTML-файлы, я вижу, что для свойства icon по-прежнему установлено значение «feature.properties.icon» вместо значения этой переменной.

console.log(feature.properties.icon) вычисляется на "home" , как и ожидалось в этом случае.

Post Front-Matter:

 ---
title: "This is an Example of a Map-Centric Post"
layout: post
tags:
 - Map

map: leaflet
center: "33.733784, -84.389369"
zoom: 9
map-background: terrain
markers: # [ Coordinates, Popup Content, Font-Awesome Icon, Color]
 - ["-84.312, 33.845", "Office", "home", "red"]
 - ["-84.393, 33.753", "Federal Building", "building", "blue"]

---
  

leaflet.html включить:

 <script>
var toner = L.tileLayer('http://{s}.tile.stamen.com/toner/{z}/{x}/{y}.png', {
    attribution: 'Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> amp;mdash; Map data amp;copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
    subdomains: 'abcd',
    minZoom: 0,
    maxZoom: 20
}),
terrain = L.tileLayer('http://{s}.tile.stamen.com/terrain/{z}/{x}/{y}.png', {
    attribution: 'Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> amp;mdash; Map data amp;copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
    subdomains: 'abcd',
    minZoom: 4,
    maxZoom: 18
}),
map = L.map('map', {
    layers: [{{page.map-background}}]
}).setView([ {{page.center}} ], {{page.zoom}} );

map.touchZoom.disable();
map.scrollWheelZoom.disable();
if (map.tap) map.tap.disable();

{% if page.markers %}
    var markers = [{
        "type":"FeatureCollection",
        "features":[
            {% for marker in page.markers %}
                {
                    "type":"Feature",
                    "properties":{
                        "popup": "{{marker[1]}}",
                        "icon": "{{marker[2]}}",
                        "color": "{{marker[3]}}"
                    },
                    "geometry":{
                        "type":"Point",
                        "coordinates":[ {{ marker[0] }} ]
                    }
                }{% if forloop.last == false %},{% endif %}
            {% endfor %}
        ]
    }];

L.geoJson(markers, {
    pointToLayer: function (feature, latlng) {
        console.log(feature.properties.icon) // This works!
        var mapMarker = L.AwesomeMarkers.icon({
            icon: feature.properties.icon, // This doesn't work
            prefix: 'fa',
            markerColor: feature.properties.color
        });
        return L.marker(latlng, {
            icon: mapMarker
        });
    },
    onEachFeature: function (feature, layer) {
        layer.bindPopup(feature.properties.popup);
    }
    }).addTo(map);

    {% else %}
        markerLayer.clearLayers();
    {% endif %}

</script>
  

Средства разработки:
введите описание изображения здесь

Редактировать: переключение на обозначение скобками icon: feature['properties']['icon'] работало только на index.html страница, а не страница записи в блоге.

Комментарии:

1. я очень подозреваю, что ошибка исходит из этой L.AwesomeMarkers.icon строки. Вы указали файл js для AwesomeMarkers ?

2. Да, leaflet.awesome-markers.js загружается условно непосредственно перед блоком javascript выше. Если я заменю feature.properties.icon на строку «home», плагин будет работать нормально.

3. упс, тогда попробуйте использовать обозначение в виде скобок, например feature['properties']['icon']

4. Действительно, действительно странно. Это исправило мою проблему на index.html страница, на которой я публикую последние 5 сообщений в блоге. Когда я нажимаю на сообщение, чтобы перейти на страницу, специфичную для публикации, я получаю ту же ошибку Uncaught TypeError: Cannot read property 'icon' of undefined , несмотря на использование того же javascript для обработки страницы.

5. рад, что помогло. для конкретных страниц блога откройте консоль и введите markers и дайте мне знать результат