Как правильно перенаправить на динамическую страницу в Jquery Mobile?

Я запускаю генератор динамических страниц в JQM и изо всех сил пытаюсь заставить его работать правильно.

Когда пользователь нажимает на ссылку, я перехватываю вызов changePage следующим образом:

  ...
  .on("pagebeforechange", function (e, data) {
    if (typeof data.toPage === "string") {
      init.parsePage(util.parseLink(data.toPage), true);
      e.preventDefault();
    }
  })

который вызовет мой метод parsePage, который генерирует новую страницу, инициализирует и добавляет ее в DOM следующим образом:

  $(document).enhanceWithin();
  $.mobile.initializePage();
  // go to the new page
  $.mobile.changePage("#" + config.id);

Моя проблема в том, что использование e.preventDefault() и новый вызов changePage снова попадут в мой прослушиватель pagebeforechange и зациклятся навсегда. Я также попытался не препятствовать первоначальному вызову страницы изменения и просто изменить параметры data.toPage, но сборка моей страницы занимает «слишком много времени», и нет возможности отложить JQM до тех пор, пока страница не будет собрана.

Вопрос:
Как мне вызвать новый переход, который не "улавливается" моим слушателем или лучше, как мне отложить переход JQM, пока все не будет готово (промисы было бы неплохо иметь здесь :-)

Спасибо!


person frequent    schedule 24.10.2013    source источник
comment
Я делал что-то подобное с jQM. Я использовал событие pagebeforechange, чтобы создать собственный способ обработки переменных URL. Я превратил его в довольно автономный подключаемый модуль, но он переопределял бы любую обработку событий pagebeforechange, которая у вас уже была.   -  person Cameron Askew    schedule 24.10.2013
comment
У меня есть собственная обработка плагинов, так что все в порядке. Я хотел бы знать, если вы создадите новую страницу, вы вызовете новую? Страница перехода JQM на него. Если да, то как предотвратить перехват этого нового вызова changepage вашим обработчиком pagebeforechange?   -  person frequent    schedule 24.10.2013
comment
pagebeforechange будет запущен, но вы можете передать что-то через URL-адрес в любом месте после хэша, чтобы вести себя по-другому в обработчике   -  person Cameron Askew    schedule 24.10.2013
comment
@ Омар: не совсем так. Я более или менее делаю то же самое, но это должно быть полностью общим, без особых условий и идентификаторов страниц. Чтобы добавить интриги, мне также нужно пропустить создание новой страницы, если я вернусь к первой странице, которая может быть только /.   -  person frequent    schedule 24.10.2013


Ответы (1)


Мое текущее рабочее (неудовлетворительное) решение:

  // generate dynamic pages
  .on("pagebeforechange", function (e, data) {
    var page;

    if (typeof data.toPage === "string") {
      page = document.getElementById(data.toPage.replace("#",""));

      if (page || data.toPage === $.mobile.getDocumentUrl()) {
        return;
      }
      init.parsePage(util.parseLink(data.toPage), true);
      e.preventDefault();
    }
  })

Итак, я проверяю, находится ли страница в DOM, потому что, поскольку я создаю страницу динамически, она будет внедрена в DOM перед изменением страницы. Таким образом, на первой странице перед изменением страница не существует, поэтому она будет сгенерирована, а на втором этапе она будет в DOM, поэтому я return.

Проблемы с этим:

  • Возврат к первой странице всегда будет находить страницу в DOM (останавливать переход, когда это не нужно) или запускать создание новой страницы, когда URL-адрес первой страницы равен /. Можно решить, сравнив data.toPage (например, localhost/app/) с $.mobile.getDocumentUrl() (url-адрес документа — помните, что вы всегда остаетесь в первом загружаемом DOM, следовательно, documentUrl). Это позволяет идентифицировать первую страницу.
  • pagebeforechange также будет срабатывать при открытии всплывающих окон, поэтому это также не должно вызывать переход. Проверка на options.role
  • Что, если data.toPage — это полный URL-адрес, а не #foo?
person frequent    schedule 24.10.2013