Плагин MapQuest и Leaflet - карта не отображается после обновления

Я работаю с Ionic 3 и Angular 5 и хочу отобразить карту в своем приложении. Я создал компонент карты, но у меня возникают проблемы с отображением карты после обновления страницы.

MapComponent

карта.html

<div id="map" style="height:100%; width: 100%;"></div>

карта.тс

По сути, я создаю новый необработанный элемент карты, чтобы избежать инициализации карты в том же элементе HTML, что вызывает ошибку Leaflet («контейнер карты уже инициализирован»)

ngOnInit() {
    var map: any = null;
    var mapElement = document.getElementById("map");
    mapElement.parentElement.innerHTML = '<div id="map" style="height:100%; width: 100%;"></div>';
    console.log("new map element created");
    var initMap = function () {
        console.log("init map..");
        L.mapquest.key = 'XXXXXX';
        map = L.mapquest.map('map', {
          center: [37.7749, -122.4194],
          layers: L.mapquest.tileLayer('map'),
          zoom: 15
        });
    }
    initMap();
}

Результат

Карта корректно отображается с первого раза. Но когда я возвращаюсь во второй раз на страницу, где отображается карта, я не получаю никакой ошибки, а просто получаю пустой элемент div, как будто Leaflet не может инициализировать карту. Так же в консоли вижу, что элемент создается до инициализации карты, так что должно работать.

Есть ли у вас какие-либо материалы, чтобы помочь мне с этой проблемой? Заранее спасибо.


person exe-cute-table    schedule 19.07.2018    source источник
comment
Что вы используете для навигации по вашему приложению?   -  person jeff chef    schedule 19.07.2018
comment
Метод push Ionic NavController.   -  person exe-cute-table    schedule 19.07.2018


Ответы (1)


Попробуйте использовать ionViewDidEnter()

ionViewDidEnter() { 
var map: any = null;
var mapElement = document.getElementById("map");
mapElement.parentElement.innerHTML = '<div id="map" style="height:100%; width: 100%;"></div>';
console.log("new map element created");
var initMap = function () {
    console.log("init map..");
    L.mapquest.key = 'XXXXXX';
    map = L.mapquest.map('map', {
      center: [37.7749, -122.4194],
      layers: L.mapquest.tileLayer('map'),
      zoom: 15
    });
}
initMap();
}

ionViewDidEnter() запускается всякий раз, когда вы заходите на страницу, независимо от того, кэширована она или нет.

person jeff chef    schedule 19.07.2018
comment
Отредактировал мой ответ, попробуйте - person jeff chef; 19.07.2018
comment
Спасибо за ваш ответ, но я работаю над одним компонентом, включенным в страницу. Это событие не запускается при отображении компонента карты. - person exe-cute-table; 19.07.2018
comment
Итак, карта вообще не отображается при использовании ionViewDidEnter()? - person jeff chef; 19.07.2018
comment
да, потому что функция никогда не запускается. В моем коде запускается ngOnInit, потому что мой класс реализует интерфейс OnInit. - person exe-cute-table; 19.07.2018
comment
Попробуйте поместить функцию setTimeout() в свою функцию ngOnInit перед загрузкой карты. Проверьте ответ на этот вопрос для справки Ref - person jeff chef; 20.07.2018
comment
Я не уверен в этом, это кажется неправильным способом достижения требований. Я видел другие способы дождаться загрузки внешней библиотеки, например, в этом посте dev.to/timber/wait-for-a-script-to-load-in-javascript-579k - person exe-cute-table; 20.07.2018
comment
В любом случае спасибо за ваш отзыв! - person exe-cute-table; 20.07.2018