我正在使用Laravel 5.7 开发的应用程序中使用“vue2-google-maps”包。在这种情况下,我正在创建一个名为google-map的组件。在这个组件中使用了gmap-autocomplete和gmap-map。该组件在app.js中注册,并且地图和自动完成输入都可以正常工作。问题是输入位于地图上方,而我想要的是它位于地图内。
我希望它看起来像下图:
这通常可以通过以下几行来实现(不使用 vue 或那个包):
let inputSearch = document.getElementById('pac-input');
searchBoxAdd = new google.maps.places.SearchBox(inputSearch );
myMap.controls[google.maps.ControlPosition.TOP_CENTER].push(searchBoxAdd );
但在这种情况下,情况就不一样了。根据文档,我看到我可以通过将“地图”对象添加ref="mapRef"
到我的 gmap-map 组件并添加
mounted () {
this.$refs.mapRef.$mapPromise.then((map) => {
// En este punto ya tengo mi objeto map.
})
}
基于此信息,我尝试执行以下操作:
mounted () {
this.$refs.mapRef.$mapPromise.then((map) => {
let inputSearch = document.getElementById('pac-input');
searchBoxAdd = new google.maps.places.SearchBox(inputSearch );
map.controls[google.maps.ControlPosition.TOP_CENTER].push(searchBoxAdd );
})
但它仍然没有加载地图内的输入,并且在控制台中它向我显示以下错误:
controls.js:118 Uncaught (in promise) TypeError: Cannot read property 'zIndex' of undefined
我离开了我的主要组件,这将是“谷歌地图”
<template>
<div>
<div>
<h2>Search and add a marker</h2>
<label>
<div class="form-inline">
<gmap-autocomplete
class="form-control"
@place_changed="setPlace">
</gmap-autocomplete>
<button @click="addMarker" class="btn btn-primary btn-flat">Add</button>
</div>
</label>
<br/>
</div>
<br>
<gmap-map ref="mapRef"
:center="center"
:zoom="12"
style="width:100%; height: 400px;"
>
<gmap-marker
:key="index"
v-for="(m, index) in markers"
:position="m.position"
@click="center=m.position"
></gmap-marker>
</gmap-map>
</div>
</template>
<script>
import {gmapApi} from 'vue2-google-maps';
export default {
name: "GoogleMap",
data() {
return {
// default to Montreal to keep it simple
// change this to whatever makes sense
center: { lat: 45.508, lng: -73.587 },
markers: [],
places: [],
currentPlace: null
};
},
mounted() {
this.geolocate();
},
methods: {
// receives a place object via the autocomplete component
setPlace(place) {
this.currentPlace = place;
},
addMarker() {
if (this.currentPlace) {
const marker = {
lat: this.currentPlace.geometry.location.lat(),
lng: this.currentPlace.geometry.location.lng()
};
this.markers.push({ position: marker });
this.places.push(this.currentPlace);
this.center = marker;
this.currentPlace = null;
}
},
geolocate: function() {
navigator.geolocation.getCurrentPosition(position => {
this.center = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
});
}
}
};
</script>
谢谢。干杯!
我已经设法解决了它,我通过以下步骤做到了:
添加
ref="mapRef"
到gmap-map标签。稍后我将能够访问“地图”对象。标签应如下所示:我的控制如下:
带有“hide”类的“父”div很重要,否则输入将在地图加载完成之前显示在页面上,然后移动到里面。有了这个,当它准备好时,地图会直接在里面显示。其余的已经是样式...
我将添加一个额外的设置来隐藏mapTypeControl。这不是必需的。
一旦组件被挂载,即在 "
mounted()
" 事件中,我将使用 "map" 对象来添加我的组件。代码应该是这样的:完成所有这些后,我得到以下输出:
我希望这可以帮助别人。干杯!
根据文档(通常在 javascript 中),当您实例化一个新的 Searchbox 时,您得到的是“类”的实例(在这种情况下是一个对象)。
相反,当你推送一些东西时,
map.controls[<ubicación>]
谷歌地图期望的是一个 HTMLElement。这意味着您可以尝试:如果这不起作用,我会尝试
map_idle
在操作地图容器的 DOM 之前捕获第一个事件。