自动完成时的Google API getPlace在手动触发时返回undefined

时间:2016-10-04 15:31:38

标签: javascript autocomplete google-places-api

我希望能够在手动触发此事件时从autocomplete.getPlace()返回数据。

基本上,我有一个函数可以在Lat/Lng中获取用户位置,之后我想获得用户getPlace(),因为有更多有用的数据,例如place_id,照片(最多想要的,参考等等。

到目前为止,我几乎可以做所有事情,我甚至可以手动触发事件,但它返回undefined。这是我到目前为止的代码:

var latLng = response; //Comes from another function
geocoder.geocode({'location': latLng}, function(results, status) {
    if (status === 'OK') {
        if (results[1]) {
            var fullAddress = results[0].formatted_address;

            var input = document.createElement("input");
                input.setAttribute("value", fullAddress);

            var autocomplete = new google.maps.places.Autocomplete(input);

            google.maps.event.addListener(autocomplete, 'place_changed', function () {
                var thisPlace = autocomplete.getPlace();
                console.log(thisPlace);
            });

            google.maps.event.trigger(autocomplete, 'place_changed');
        }
    }
});

此处的所有内容均有效,但autocomplete.getPlace()的回复为undefined

如果运行相同的函数,但是从本机自动完成元素运行,则返回正确。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

看起来您希望JavaScript等效于Android Place PickerPlaces library中没有此类小部件。考虑filing a feature request

您当前的方法似乎遵循这些方针:

  1. 反向地理编码用户latlng到最近的地址。
  2. 在该地址获取地点。
  3. 在步骤1中使用geocoder.geocode()是可以的,但是你需要注意你所接受的结果:如果第一个结果是公共汽车站,那么它的地址就没用了。

    您最好使用Radar Search来搜索原始Lat / Lng输入的最近位置。这也避免了可能来自反向地理编码将用户位置捕捉到不那么接近的地址的问题。然后,您需要发出一些Details个请求,以获取最近N个地方的名称(以及其他详细信息)。

    在步骤2中使用自动填充功能不会很好。自动填写包含多个地方的地址很少列出所有地址。

    此外:不要手动触发place_changed,这不是它的工作原理。

    只有在Autocomplete可用后,PlaceResult类才会触发place_changed事件。如果用户从自动填充预测中选择了一个地点,则需要调用地方详情服务,以检索您实际想要获取的详细信息。

      

    当PlaceResult可用于用户选择的地方时,会触发此事件。   如果用户输入控件未建议的Place的名称并按Enter键,或者Place detail请求失败,则会触发place_changed事件,该事件包含name属性中的用户输入,没有其他属性定义

    如果您手动触发place_changed,则没有PlaceResult为您准备就绪,这就是为什么autocomplete.getPlace()只会返回undefined