Я пытаюсь преобразовать мой Googlemaps.js в компонент vue, в настоящее время у меня есть метод для CustomMarker()
, а затем в разделе mounted()
вы увидите ниже overlay = new CustomMarker(...)
.
Кажется, что он не может получить доступ к функции CustomMarker
, вызывая следующую ошибку:
app.js:5387 Uncaught ReferenceError: CustomMarker is not defined
at initialize
Как я могу сделать эту функцию слишком инициализированной правильно?
GoogleMap.vue
<template>
<div class="google-map" id="map"></div>
</template>
<script>
export default {
name: 'google-map',
methods:{
// Custom Overlay Marker
CustomMarker(latlng, map, args) {
this.latlng = latlng;
this.args = args;
this.setMap(map);
},
},
mounted() {
this.CustomMarker.prototype = new google.maps.OverlayView();
this.CustomMarker.prototype.draw = function () {
var self = this;
var div = this.div;
if (!div) {
div = this.div = document.createElement('div');
div.className = 'marker';
div.style.position = 'absolute';
div.style.cursor = 'pointer';
div.style.width = '37px';
div.style.height = '42px';
// div.style.background = 'blue';
if (typeof (self.args.marker_id) !== 'undefined') {
div.dataset.marker_id = self.args.marker_id;
}
google.maps.event.addDomListener(div, "click", function (event) {
google.maps.event.trigger(self, "click");
});
var panes = this.getPanes();
panes.overlayImage.appendChild(div);
}
var point = this.getProjection().fromLatLngToDivPixel(this.latlng);
if (point) {
div.style.left = (point.x) + 'px';
div.style.top = (point.y - 38) + 'px';
}
};
this.CustomMarker.prototype.remove = function () {
if (this.div) {
this.div.parentNode.removeChild(this.div);
this.div = null;
}
};
this.CustomMarker.prototype.getPosition = function () {
return this.latlng;
};
//Instalize Map
let map;
function initialize() {
const mapCanvas = document.getElementById('map');
const myLatlng = new google.maps.LatLng(-62, 23);
const mapOptions = {
zoom: 14,
backgroundColor: '#983336',
disableDefaultUI: true,
center: myLatlng,
draggable: false,
scrollwheel: false,
disableDoubleClickZoom: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(mapCanvas, mapOptions);
// Custom Marker
overlay = new CustomMarker(
myLatlng,
map,
{
marker_id: 'red-marker'
}
);
// Style the map
map.set('styles', [
{
"featureType": "landscape",
"stylers": [
{ "visibility": "simplified" },
{ "color": "#CD2D2B" }
]
}
]);
}
google.maps.event.addDomListener(window, 'load', initialize);
//Keep Centered on resize
google.maps.event.addDomListener(window, "resize", function () {
var center = map.getCenter();
google.maps.event.trigger(map, "resize");
map.setCenter(center);
//map.setDraggable(false);
});
}
}
</script>
<style scoped>
</style>
ОБНОВЛЕНИЕ 27.02.19
Карта теперь загружается, однако CustomMarker не может показаться, что есть проблема с *Секция 1021 * как то вообще не срабатывает.
Я также получаю следующую ошибку TypeError: this.map.setCenter is not a function
<script>
export default {
name: 'google-map',
data() {
return {
map: null,
overlay: null,
center: { lat: -62, lng: 23 },
mapStyle: [
{
"featureType": "landscape",
"stylers": [
{ "visibility": "simplified" },
{ "color": "#CD2D2B" }
]
}
],
}
},
methods:{
initializeMap() {
const mapCanvas = document.getElementById('map');
const myLatlng = new google.maps.LatLng(this.center);
const mapOptions = {
zoom: 14,
backgroundColor: '#983336',
disableDefaultUI: true,
center: myLatlng,
draggable: false,
scrollwheel: false,
disableDoubleClickZoom: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
this.map = new google.maps.Map(mapCanvas, mapOptions);
// Custom Marker
this.overlay = new this.CustomMarker(
myLatlng,
this.map,
{ marker_id: 'red-marker' }
);
// Style the map
this.map.set('styles', this.mapStyle);
},
// Custom Overlay Marker
CustomMarker(latlng, map, args) {
this.latlng = latlng;
this.args = args;
this.map = map;
}
},
async mounted() {
//Instalize Map
this.initializeMap()
//NOTHING BELOW FOR CustomMarker SEEMS TO FIRE
this.CustomMarker.prototype = new google.maps.OverlayView();
this.CustomMarker.prototype.draw = function () {
console.log('test') //DOES NOTHING
const self = this;
const div = this.div;
console.log('div', div)
if (!div) {
div = this.div = document.createElement('div');
div.className = 'marker';
div.style.position = 'absolute';
div.style.zIndex = '9999';
div.style.cursor = 'pointer';
div.style.width = '37px';
div.style.height = '42px';
div.style.background = 'blue';
if (typeof (self.args.marker_id) !== 'undefined') {
div.dataset.marker_id = self.args.marker_id;
}
google.maps.event.addDomListener(div, "click", function (event) {
google.maps.event.trigger(self, "click");
});
var panes = this.getPanes();
panes.overlayImage.appendChild(div);
}
var point = this.getProjection().fromLatLngToDivPixel(this.latlng);
if (point) {
div.style.left = (point.x) + 'px';
div.style.top = (point.y - 38) + 'px';
}
};
this.CustomMarker.prototype.remove = function () {
if (this.div) {
this.div.parentNode.removeChild(this.div);
this.div = null;
}
};
this.CustomMarker.prototype.getPosition = function () {
return this.latlng;
};
google.maps.event.addDomListener(window, 'load', this.initializeMap);
//Keep Centered on resize
google.maps.event.addDomListener(window, "resize", function () {
// console.log(this.map)
// var center = this.map.getCenter();
google.maps.event.trigger(this.map, "resize");
map.setCenter(this.center);
//map.setDraggable(false);
});
}
}
</script>