Использование автозаполнения Google Места с помощью Meteor

Итак, я пытаюсь добавить строку поиска https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform в мое приложение Meteor. Сначала мне нужно было загрузить библиотеку Google Адресов. Однако эта ссылка также пытается напрямую написать в DOM, чтобы захватить другую ссылку. Meteor не позволяет этого, поэтому я решил загрузить два файла js, как это.

Template.listingSubmit.rendered = function(){
if (!this.rendered){
 var script = document.createElement("script");
 script.type = "text/javascript";
 script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=places";
 document.body.appendChild(script);

 var script = document.createElement("script");
 script.type = "text/javascript";
 script.src = "https://maps.gstatic.com/cat_js/maps-api-v3/api/js/17/13/%7Bmain,places%7D.js";
 document.body.appendChild(script);

 this.rendered = true;
}
};

Это работает? Мой следующий вопрос: как инициализировать текстовое поле автозаполнения? Html в соответствующем шаблоне прост.

<div id="locationField">
  <input id="autocomplete" placeholder="Enter your address" type="text">
</div>

Теперь я попытался добавить

var autocomplete = new google.maps.places.Autocomplete(
  (document.getElementById('autocomplete')),{types: ['geocode'] }
);

в Template.listingSubmit.rendered, но ничего не происходит. Я получаю ошибку, не определенную Google. Что пошло не так?

Ответ 1

Я столкнулся с одной и той же проблемой и просто нашел решение. Вот что я сделал.

Сначала добавьте следующий пакет в свой проект с помощью:

`mrt add googlemaps`

или, если вы используете meteor >= 0.9:

meteor add mrt:googlemaps

Затем создайте следующий файл:/client/lib/googlePlaces.js

Поместите следующий код внутри этого js файла:

GoogleMaps.init({
  'sensor': false, //optional
  'key': 'your api key here!', //optional
  'language': 'en',  //optional
  'libraries': 'places'
});

Очевидно, замените ключ api на свой ключ! Этот код инициирует вызов google api и загружает места script клиенту.

Теперь, чтобы ответить на ваш вопрос о том, как заставить автозаполнение работать. Ваши HTML и js выглядят отлично, за исключением одного. Вам нужно обернуть js в функцию window.onload, чтобы он дождался загрузки google api script!

HTML

<div id="locationField">
  <input id="autocomplete" placeholder="Enter your address" type="text">
</div>

JS

window.onload = function() {
  var autocomplete = new google.maps.places.Autocomplete(
    (document.getElementById('autocomplete')),{types: ['geocode'] }
  );
};

Я не тестировал ваш HTML/JS, но он очень похож на мой.

Ответ 2

Думаю, я поделился бы тем, что, наконец, сработало для меня
Пакет остается прежним, но js изменился:

Template.myTemplateName.rendered = function () { 
    window.onload = function() { 

        input = document.getElementById('autocomplete'); 
        autocomplete = new google.maps.places.Autocomplete(input); 

        // When the user selects an address from the dropdown, 
        google.maps.event.addListener(autocomplete, 'place_changed', function() { 

             // Get the place details from the autocomplete object. 
             var place = autocomplete.getPlace(); 

             console.log("place: " + JSON.stringify(place) ); 
        }); 
    }; 
};

Ответ 3

Это решение, которое, наконец, сработало для меня: я добавил пакет mrt:googlemaps.

Затем я настраиваю googlePlaces.js следующим образом:

GoogleMaps.init({
'sensor': true, //optional
'key': '***my api key***', //optional
'language': 'en',  //optional
'libraries': 'places'
 });

Затем я установил переменную для каждого поля ввода, которая собиралась использовать API автозаполнения, и установите для него шаблон .render равным:

   var initAutoCompleteProfile = function() {
      var autocomplete = new google.maps.places.Autocomplete(
        (document.getElementById('autocomplete')),{types: ['geocode'] }
      );
};

var initAutoCompletePost = function() {
      var autocomplete = new google.maps.places.Autocomplete(
        (document.getElementById('autocomplete')),{types: ['geocode'] }
      );
};

Template.userUpdate.rendered = initAutoCompleteProfile;

Template.postSubmit.rendered = initAutoCompletePost;

Идентификатор элемента был "автозаполнен" для каждого элемента, который будет его использовать, но самое главное, что вы делаете переменную для каждого элемента, который будет использовать ее для каждого шаблона, а затем установите этот шаблон rendered, равный этой переменной.

Вопрос/решение здесь: Метеор Google Maps Autocomplete работает только один раз на нескольких шаблонах