Это мой первый проект VueJS, и у меня есть vue2-google-maps , но я столкнулся с проблемой при попытке подключить маркеры карты к каналу JSON моего сайта (используя Wordpress REST API), значения Lat и Lng возвращаются undefined или NaN .
В дальнейшемрасследование (благодаря @ QuỳnhNguyễn ниже) кажется, что экземпляр Google Maps запускается до того, как данные будут готовы.Я пытался следить за загрузкой канала перед инициализацией карты, но, похоже, он не работает.
Местоположения маркеров извлекаются из WordPress REST API с использованием JSON и существуют в массиве (местоположения).Массив присутствует и заполняется в Vue Dev Tools (51 запись), но при проверке mount массив пуст.Данные извлекаются на этапе созданный , поэтому я не знаю, почему он не будет готов к подключенной стадии.
Код, о котором идет речь, как показано ниже ...
Шаблон:
<template>
<gmap-map v-if="feedLoaded" ref="map" :center="center" :zoom="zoom" :map-type-id="mapTypeId" :options="options">
<gmap-marker
:key="index" v-for="(m, index) in locations"
:position="{ lat: parseFloat(m.place_latitude), lng: parseFloat(m.place_longitude) }"
@click="toggleInfoWindow(m,index)"
:icon="mapIconDestination">
</gmap-marker>
<gmap-info-window></gmap-info-window>
</gmap-map>
</template>
Скрипт
<script>
const axios = require('axios');
const feedURL = "API_REF";
export default {
props: {
centerRef: {
type: Object,
default: function() {
return { lat: -20.646378400026226, lng: 116.80669825605469 }
}
},
zoomVal: {
type: Number,
default: function() {
return 11
}
}
},
data: function() {
return {
feedLoaded: false,
zoom: this.zoomVal,
center: this.centerRef,
options: {
mapTypeControl: false,
streetViewControl: false,
},
mapTypeId: 'styledMapType',
mapIconDestination: '/images/map-pin_destination.png',
mapIconActivity: '/images/map-pin_activity.png',
mapIconAccommodation: '/images/map-pin_accommodation.png',
mapIconEvent: '/images/map-pin_event.png',
mapIconBusiness: '/images/map-pin_business.png',
locations: [],
markers: []
}
},
created: function() {
this.getData();
},
mounted: function() {
this.$nextTick(() => {
this.$refs.karrathaMap.$mapPromise.then((map) => {
var styledMapType = new google.maps.StyledMapType(
[...MAP_STYLE SETTINGS...]
)
map.mapTypes.set('styled_map', styledMapType);
map.setMapTypeId('styled_map');
})
});
},
watch: {
feedLoaded: function() {
if (this.feedLoaded == true) {
console.log(JSON.stringify(this.locations))
}
}
},
methods: {
getData() {
const url = feedURL;
axios
.get(url)
.then((response) => {this.locations = response.data;})
.then(this.feedLoaded = true)
.catch( error => { console.log(error); }
);
}
}
}
</script>