Карты Google не отображаются с использованием ионных/angular2

Я использую ionic2 для отображения карт Google. Но я получаю пустую страницу, когда я запускаю следующий ниже код.

export class NearByStoresPage {

  constructor(private nav: NavController, private confData: ConferenceData) {
    this.loadNearByOffers();
  }

  loadNearByOffers(){

    let options = {timeout: 10000, enableHighAccuracy: true};

    navigator.geolocation.getCurrentPosition(

        (position) => {
            let latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);               

            let mapOptions = {
                center: latLng,
                zoom: 16,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            }

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

            let marker = new google.maps.Marker({
              map: map,
              animation: google.maps.Animation.DROP,
              position: map.getCenter()
            });

            let content = "<h4>Information!</h4>";          

            let infoWindow = new google.maps.InfoWindow({
              content: content
            });

            google.maps.event.addListener(marker, 'click', function(){
              infoWindow.open(map, marker);
            });
        },

        (error) => {
            console.log(error);
        }, options

    );
  }
}

И я включаю файл в файл index.html,

<script src="https://maps.googleapis.com/maps/api/js?key=APIKEY"></script>

Html файл,

<ion-navbar *navbar>
  <button menuToggle>
    <ion-icon name="menu"></ion-icon>
  </button>
  <ion-title>Near By Offers</ion-title>
</ion-navbar>

<ion-content class="map-page">
  <div id="map"></div>
</ion-content>

Но следующий код работает нормально,

this.confData.getMap().then(mapData => {
      let mapEle = document.getElementById('map');

      let map = new google.maps.Map(mapEle, {
        center: mapData.find(d => d.center),
        zoom: 16
      });

      mapData.forEach(markerData => {
        let infoWindow = new google.maps.InfoWindow({
          content: `<h5>${markerData.name}</h5>`
        });

        let marker = new google.maps.Marker({
          position: markerData,
          map: map,
          title: markerData.name
        });

        marker.addListener('click', () => {
          infoWindow.open(map, marker);
        });
      });

      google.maps.event.addListenerOnce(map, 'idle', () => {
        mapEle.classList.add('show-map');
      });

    });

Ответы

Ответ 1

Добавьте ширину и высоту на карту DIV:

<div id="map" style="width:800px;height:600px"></div>

Также эта строка

<script src="https://maps.googleapis.com/maps/api/js?key=APIKEY"></script>

необходимо указать функцию обратного вызова

Ответ 2

Я думаю, проблема связана с тем, что вы вызываете метод this.loadNearByOffers(); в конструкторе. Этот метод пытается затем загрузить карту, получив элемент из DOM

document.getElementById("map")

Но когда ваш конструктор выполнен, этот элемент в DOM еще не существует, и почему карта не загружена должным образом.

Я не знаю, какую версию Ionic вы используете в проекте, но вы можете использовать один из событий страницы, например ionViewDidEnter чтобы убедиться, что код будет выполнен (и карта будет инициализирована) после того, как будут доступны элементы DOM.

ionViewDidEnter(){
  // the html of the page is now available
  this.loadNearByOffers();
}

Здесь вы можете найти рабочий плунжер .

Ответ 3

Попробуйте вызвать метод loadNearByOffers() следующим образом.

ionViewLoaded(){
   this.platform.ready().then(() => {
   this.loadNearByOffers();
   }
}

карта должна быть загружена на событие готовности устройства.