Vue-google-map 自动完成两种方式绑定不起作用

Posted

技术标签:

【中文标题】Vue-google-map 自动完成两种方式绑定不起作用【英文标题】:Vue-google-map autocomplete two way binding not working 【发布时间】:2019-03-09 10:24:57 【问题描述】:

我正在使用vue-google-maps,并且我已经实现了该插件并且它可以完美运行,但是有一个小问题(或者我可能无法正确完成)。当我实现自动完成功能时,它以一种方式工作。我输入地址,地图将我指向所选地点,但是当我拖动指针时,它不会更新搜索字段中的地址。 我正在使用 Vuejs 2 和vue-google-maps

这就是我正在做的:

<template>
    <div>
        <label>
            AutoComplete
            <GmapAutocomplete :position.sync="markers[0].position" @keyup.enter="usePlace" @place_changed="setPlace">
            </GmapAutocomplete>
            <button @click="usePlace">Add</button>
        </label>
        <br/>

        <gmap-map
            :center="center"
            :zoom="7"
            map-type-id="terrain"
            style="width: 100%; height: 500px"
        >
            <gmap-marker
                @dragend="updateMaker" 
                :key="index"
                v-for="(m, index) in markers"
                :position="m.position"
                :clickable="true"
                :draggable="true"
                @click="center=m.position"
            ></gmap-marker>

        </gmap-map>

    </div>
</template>

<script>

    export default 
        data() 
            return 
                center: lat: 10.0, lng: 10.0,
                markers: [
                    position: lat: 11.0, lng: 11.0
                ],
                place: null,
            
        ,
        description: 'Autocomplete Example (#164)',
        methods: 
            setPlace(place) 
                this.place = place
            ,
            setDescription(description) 
                this.description = description;
            ,
            usePlace(place) 
                if (this.place) 
                    var newPostion = 
                        lat: this.place.geometry.location.lat(),
                        lng: this.place.geometry.location.lng(),
                    ;
                    this.center = newPostion;
                    this.markers[0].position =  newPostion;
                    this.place = null;
                
            ,
            updateMaker: function(event) 
                console.log('updateMaker, ', event.latLng.lat());
                this.markers[0].position = 
                    lat: event.latLng.lat(),
                    lng: event.latLng.lng(),
                
            ,
        
    
</script>

【问题讨论】:

【参考方案1】:

我不确定这是否受支持。您可能必须自己实现。

在您的updateMaker() 方法中,您可以使用google.maps.Geocoder() 自己查找地址名称:

updateMaker: function(event) 
   const geocoder = new google.maps.Geocoder()
   geocoder.geocode( 'latLng': event.latLng , (result, status) => 
       if (status === google.maps.GeocoderStatus.OK) 
         // set the input field value with address:
         console.log(result[0].formatted_address)
       
   )

【讨论】:

【参考方案2】:

将 'ref' 添加到您的自动完成组件中,例如:

<GmapAutocomplete ref="gmapAutocomplete" :position.sync="markers[0].position" @keyup.enter="usePlace" @place_changed="setPlace">
        </GmapAutocomplete>

把 updateMarker 函数改成这样:

updateMaker: function(event) 
    console.log('updateMaker, ', event.latLng.lat());
    this.markers[0].position = 
       lat: event.latLng.lat(),
       lng: event.latLng.lng(),
    
    const geocoder = new google.maps.Geocoder()
    geocoder.geocode( 'latLng': event.latLng , (result, status) => 
        if (status === google.maps.GeocoderStatus.OK) 
          this.$refs.gmapAutocomplete.$refs.input.value = result[0].formatted_address
        
    )
,

【讨论】:

以上是关于Vue-google-map 自动完成两种方式绑定不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 之类型转换

js实现在加载页面完成后input框自动执行一个函数,怎么实现

Notion做个人博客的两种实现方式

Notion做个人博客的两种实现方式

react中元素绑定enter事件

两种方式数据绑定和反应性有啥区别?