У меня есть мобильное одностраничное веб-приложение, которое построено с использованием jquery-mobile (jqm) и нокаута. Само приложение имеет несколько страниц, но все они содержатся в одном документе HTML.
Проблема: после изменения моей модели создания модели для страницы от синхронизации до асинхронного поведения у меня возникла проблема с тем, что jquery-mobile запускает свои события до того, как данные будут готовы.
Предыстория: до недавнего времени я работал с образцами данных, в основном огромным блоком JSON, и все работало плавно. С новым асинхронным составом моделей просмотра из разных источников данные не готовы немедленно, и мой метод "buildViewModel" выполняет обратный вызов продолжения вместо просто синхронного возвращения данных.
Я подписываюсь на события pagebeforecreate и pagebeforechange и запускаю код, чтобы заполнить здесь viewmodel. Проблема в том, что после возвращения из обработчика события jqm запускает оставшуюся цепочку событий до того, как данные будут доступны. Это приводит к переходу страницы на неподготовленную страницу, что нежелательно.
Я попытался вызвать event.preventDefault
во всех предшествующих событиях и вручную вызывать $.mobile.changePage, когда страница готова быть a) улучшена, и b) переход страницы произойдет, но без везения.
Я сканировал источник jquery-mobile, но не смог обнаружить ничего похожего на то, что это позволило бы мне отложить событие pagebeforeshow
, что по сути является тем, что мне нужно, чтобы иметь возможность правильно отображать страницу.
Как я могу гарантировать, что 1) данные доступны, и 2) нокаут был применен для выполнения начальных манипуляций с DOM, прежде чем jquery-mobile попытается улучшить страницу и до того, как она выполнит переход на страницу?
Я также рассмотрел возможность использования синхронного ajax для извлечения ресурсов, но это (я думаю) не работает для ресурсов, загруженных с устройства (используя PhoneGap/Cordova), и имеет другие негативные последствия, которых я бы хотел избежать.
FWIW, я бы хотел, чтобы избежать необходимости вручную обрабатывать все события навигации, проводя вверх по всем обработчикам кликов, но при необходимости я открыт для всех решений.
Извините, если это дубликат; Я искал и читал массу вопросов, но не нашел ответа или вопроса, который был совершенно таким же. Мне просто кажется невероятным, что я первым ударил бы по этой проблеме, так как я считаю, что это распространенный сценарий.
Обновление: пояснение описания сценария проблемы.