首页 > 解决方案 > 未定义 OverlappingMarkerSpiderfier (Vue.js)

问题描述

我正在尝试为我的 Google 地图实现 OverlappingMarkerSpiderfier,它之所以有效,是因为当我单击标记时,我的标记能够“蜘蛛化”。

我的问题是,在我的 VS Code 开发控制台中,ESLint 仍然给我错误“OverlappingMarkerSpiderfier”未定义。我真的不知道问题出在哪里,因为当我单击它们时,我的标记按预期工作。下面是一张显示 OverlappingMarkerWorkers 的图片,即使 ESLint 出现错误:

在此处输入图像描述

我想摆脱该错误,以防将来因此而出现错误。我搜索了解决方案,很多人评论说 OverlappingMarkerSpiderfier 应该在 Google Maps 加载后加载。我已经这样做了,但错误仍然存​​在。

我异步加载我的谷歌地图;下面是我加载 Google 地图和 OverlappingMarkerSpiderfier 的 .js 文件:

import api_keys from './api_keys'

const API_KEY = api_keys.google_maps_api_key;
const CALLBACK_NAME = 'gmapsCallback';

let initialized = !!window.google;
let resolveInitPromise;
let rejectInitPromise;

const initPromise = new Promise((resolve, reject) => {
  resolveInitPromise = resolve;
  rejectInitPromise = reject;
});

export default function init() {
  if (initialized) return initPromise;

  initialized = true;

   window[CALLBACK_NAME] = () => resolveInitPromise(window.google);

   const script = document.createElement('script');
   script.async = true;
   script.defer = true;
   script.src = `https://maps.googleapis.com/maps/api/jskey=${API_KEY}&callback=${CALLBACK_NAME}`;
   script.onerror = rejectInitPromise;
   document.querySelector('head').appendChild(script);

   const spiderfier = document.createElement('script');
   spiderfier.defer = true;
   spiderfier.src = "https://cdnjs.cloudflare.com/ajax/libs/OverlappingMarkerSpiderfier/1.0.3/oms.min.js";
   spiderfier.onerror = rejectInitPromise;
   document.querySelector('head').appendChild(spiderfier);

   return initPromise;
}

以下是我的 GoogleMaps 组件。OverlappingMarkerSpiderfier 实现位于“watch”中:

<template>
    <div id="google-map">

    </div>
</template>

<script>
import gMaps from '../lib/gMaps.js'

export default {
    name: 'GoogleMaps',
    props: {
        events: Array
    },
    data() {
        return {
            map: null,
            locations: []
        }
    },
    async mounted() {
        try {
            const google = await gMaps();
            const geocoder = new google.maps.Geocoder();
            this.map = new google.maps.Map(this.$el);

            geocoder.geocode({ address: 'USA'}, (results, status) => {
                if (status !== 'OK' || !results[0]) {
                    throw new Error(status);
                }

                this.map.setCenter(results[0].geometry.location);
                this.map.fitBounds(results[0].geometry.viewport);
            });
        } catch (error) {
            console.error(error);
        }
    },
    watch: {
        async events() { //creates markers for the map; data is from a 3rd party API that is handled by a different component
            try {
                const google = await gMaps();

                var oms = new OverlappingMarkerSpiderfier(this.map, {
                    markersWontMove: true,
                    markersWontHide: true,
                    basicFormatEvents: true
                })

                for(let i = 0; i < this.events.length; i++) {
                    let marker = new google.maps.Marker({
                        position: {
                            lat: parseInt(this.events[i].latitude, 10),
                            lng: parseInt(this.events[i].longitude, 10)
                        },
                        map: this.map,
                        title: this.events[i].title
                    })

                    let iw = new google.maps.InfoWindow({
                        content: this.events[i].description || 'No description available.'
                    });

                    google.maps.event.addListener(marker, 'spider_click', function() {
                        iw.open(this.map, marker);
                    });

                    oms.addMarker(marker);
                }
            }
            catch(error) {
                console.error(error)
            }
        }
    }
}
</script>

<style lang="scss" scoped>
#google-map {
    width: auto;
    height: 100vh;
}
</style>

标签: javascriptgoogle-mapsvue.jsmarkerspiderfier

解决方案


尝试其中之一

  1. this.$nexttick(()=>{ 挂载钩子中的代码.... })
  2. 在实例化 OverlappingMarkerSpiderfier 之前检查是否加载了 window.google 对象并且您的地图参考可用。

推荐阅读