Мы используем Backbone.Router
только в режиме pushstate, поэтому все наши клиентские маршруты не содержат хэшей.
Однако мы столкнулись с трудностями при реализации модальных представлений в нашем приложении.
Задача заключается в следующем:
- Мы хотим, чтобы кнопка «Назад» скрывала текущее модальное представление (поэтому нам нужен URL-адрес);
- Мы хотим, чтобы Forward показывал его снова, не перерисовывая все приложение;
- Мы хотим иметь возможность показывать модальные окна «поверх» любого существующего маршрута, а не только на одной странице;
- Мы хотим иметь возможность создавать ссылки, которые сразу показывают определенное модальное окно (например, модальное окно входа в систему).
Другими словами, мы хотим, чтобы модальные представления были представлены в истории.
Нашей первой попыткой было использовать URL типа /login
для модального входа и обрабатывать их специально в обработчике route
. Когда мы находимся на /otherpage
, открытие модального окна будет переходить к /login
, а когда модальное закроется, снова перейти к /otherpage
.
Однако у этого есть очень серьезная проблема: URL-адрес типа /login
не «знает», поверх которого он должен быть нарисован, поэтому нам приходится перерисовывать все, нажимая «Назад» и «Вперед».
Это на самом деле имеет смысл: URL-адрес модального входа на главном экране должен отличаться от URL-адреса модального входа на другой странице.
Моя вторая мысль заключалась в том, что может быть, мы можем использовать хэши для указания текущего модального представления:
/
/#login
/otherpage
/otherpage#login
Это делает обработчик маршрутизации простым:
- Во-первых, нарисуйте фактические виды на основе сопоставленного маршрута, как мы делали раньше.
- После этого, если присутствует хеш, отобразить модальное представление сверху.
Это также соответствует идее о том, что хэш является «фрагментом» видимого документа. (Да, приложения — это не документы, бла-бла-бла. Мы по-прежнему хотим, чтобы они были адресуемыми.)
Есть ли в этом подходе проблемы?
Есть ли лучший подход, удовлетворяющий нашим условиям?