Вот необычный сценарий, который я пытаюсь реализовать: у меня есть модуль gmap
, в котором асинхронно загружаются карты Google. Я использую следующий код для правильного подключения Google Maps:
composition.addBindingHandler('googleMap', {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
gmap = ko.utils.unwrapObservable(valueAccessor());
var latLng = new gmaps.LatLng(37.774107,-122.420853);
var mapOptions = {
center:latLng,
zoom: 17,
disableDefaultUI: true,
mapTypeId: gmaps.MapTypeId.ROADMAP
};
gmap.googleMap = new gmaps.Map(element, mapOptions);
navigator.geolocation.getCurrentPosition(onSuccess, onError);
}
});
Мой модуль gmap — это модуль, который я хочу показать первым после входа пользователя в систему. Поэтому я хочу выполнить некоторые действия, прежде чем этот модуль должен быть показан. В большинстве случаев я мог бы использовать метод Promise in canActivate
, но! В этом случае мой модуль не прикрепляется. Но мне нужно подключить этот модуль, выполнить некоторые операции (получить записи в базе данных, определить геолокацию пользователя, добавить маркеры на карту Google на основе этих данных) и только после этого показать модуль пользователю. Как я могу заставить это работать? Я попробовал Promises, но у меня это не сработало, потому что я слушаю метод attached
, который не срабатывает, пока модуль не будет показан. Итак, вопрос: как активировать и присоединить модель представления и соответствующее представление (активация и прикрепленные обратные вызовы должны срабатывать) но не показать его до условия?
ОБНОВЛЕНИЕ: Хорошо, кажется, мой вопрос не совсем понятен. Вот мой сценарий:
1. Мой модуль входа активирован. Пользователь должен ввести свои учетные данные.
2. После успешной авторизации модуль Gmap должен быть активирован и подключен, но не отображаться. Пользователь по-прежнему должен видеть модуль SignIn и сообщение типа "Загрузка данных..."
3. Модуль Gmap должен быть полностью загружен (должны срабатывать все обратные вызовы). Мне нужна возможность взаимодействия с DOM, а значит модуль должен быть подключен. Но не отображается.
4. При выполнении некоторых условий модуль SignIn становится невидимым и отображается Gmap.
Обещание в обратном вызове активации не подходит для этого сценария, потому что представление не прикрепляется до тех пор, пока обещание не будет разрешено. В основном мне нужно что-то вроде этого после авторизации успеха:
router.navigate('#gmap', { show: false });
...or...
router.attachModule('#gmap', ...{});
Зачем мне нужно взаимодействовать с DOM и почему промис в обратном вызове активации мне не подходит? Потому что мне нужен инициированный объект Gmap, который можно инициировать только с существующим холстом gmap на странице:
composition.addBindingHandler('googleMap', {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
gmap = ko.utils.unwrapObservable(valueAccessor());
var mapOptions = {
...
};
gmap.googleMap = new gmaps.Map(element, mapOptions);
}
});
И HTML:
<div id="gmap-section">
<div id="gmap-canvas" data-bind="googleMap:map"></div>
</div>
Привязки будут работать только после прикрепления вида.