Как подождать Angular Google Maps, чтобы добавить getGMap к объекту управления
Я пытаюсь настроить прослушиватели событий на объекте google.maps.Map
, созданный директивой ui-gmap-google-map
из Angular Google Maps библиотека.
Мне нужно сделать это динамически, поэтому, по крайней мере, по моему краткому тестированию, использование параметра events
в директиве ui-gmap-google-map
не будет работать (потому что кажется, что "читать" значение параметра только один раз, но, возможно, я ошибаюсь в этом).
Поэтому я решил использовать параметр control
, который увеличивает объект, названный значением параметра, с помощью методов getGMap
и refresh
. Вот как выглядит моя директива:
<ui-gmap-google-map center="appCtrl.mapSetup.center"
zoom="appCtrl.mapSetup.zoom"
control="appCtrl.mapSetup">
</ui-gmap-google-map>
Наконец, я загружаю API Карт Google асинхронно и полагаюсь на услугу/обещание GoogleMapApi
(часть Angular Карты Google), чтобы знать, когда я могу безопасно работать с объектом google.maps.Map
(например, добавление слушателей событий и т.д.). Вот небольшой пример того, как это выглядит:
// inside the AppController constructor, see the fiddle linked below
var mapSetup = this.mapSetup;
GoogleMapApi.then(function () {
google.maps.event.addListener(mapSetup.getGMap(), 'click', function () {
alert('hello');
});
Итак, когда страница загружается (здесь скрипка), я получаю "TypeError: undefined не является функцией", потому что mapSetup
объект не был добавлен с помощью getGMap
или refresh
. Похоже, что это должно было быть основано на моем понимании документации.
Я завернул вызов addListener
с помощью $timeout
(службы Angular) с задержкой в несколько сотен миллисекунд, а затем он работал, потому что к этому времени объект mapSetup
был дополнен getGMap
.
Есть ли способ избежать использования $timeout
с произвольной задержкой до тех пор, пока объект control
-specified не будет добавлен?
Ответы
Ответ 1
По моему тестированию и по тому, что я читал в документах и в различных комментариях к комментариям, кажется, что это (ожидание объекта control
для увеличения) является одной из вещей, которые служба uiGmapIsReady
в Angular Google Maps был разработан для.
Мое настоящее понимание заключается в том, что uiGmapGoogleMapApi
следует использовать для ожидания загрузки асинхронной загрузки API Карт Google и uiGmapIsReady
следует использовать для ожидания директив uiGmap*
и всего, что они влекут за собой (включая control
увеличение объекта) завершить. Именование говорит все это.
Здесь новая демонстрационная скрипта. Это демонстрационное использование IsReady
:
IsReady.promise().then(function (maps) {
var map1 = $scope.control.getGMap();
var map2 = maps[0].map;
alert(map1 === map2); // true
});
IsReady.promise
(источник) принимает необязательный целочисленный аргумент, указывающий (я уверен) число директив ui-gmap-google-map
, используемых вашей страницей. По умолчанию он равен 1
. (Если вам посчастливилось дать ему "неправильный" номер, я считаю, что существует возможность (удаленная?), Что возвращенное обещание никогда не решит.)
Ответ 2
В итоге я использовал vanilla JS и получил все, чтобы работать без головной боли. Angular Карты Google - отличная идея, но, по крайней мере, в моем случае проблемы превосходят преимущества.
Проведя час или около того в github и stackoverflow, я понял, что предлагаемые решения (например, https://github.com/angular-ui/angular-google-maps/issues/308) были взломом взломать, и поскольку моя задача была просто "отобразить некоторые маркеры на карте и центрировать карту на них", я не хочу использовать хак.
Документация gmaps содержит множество примеров (в vanilla JS), которые можно использовать в приложении Angular, скопировать + вставить, и все готово.
Опять же, это мой личный опыт, возможно, не для вас.