Использование истории GWT для передачи параметров?

У меня есть страница под названием Orders и страница под названием OrderDetails. Как описано в отличном учебнике MVP, я работаю с историей (с центральным ValueChangeListener) и "обработчиком событий" HandlerManager.

У меня есть обработчик, зарегистрированный для события, который кто-то нажимает на заказ, который в основном создает OrderDetailPresenter, передает идентификатор заказа (который содержится в ShowOrderDetailEvent), а затем вызывает History.newItem("orderDetails").

Это имеет два основных недостатка: этот новый шаг истории НЕ знает, какой идентификатор заказа был передан. Например, если кто-то закладок на странице сведений о заказе (или идет назад, а затем вперед в своем браузере), они будут получить пустую страницу без информации о заказе.

Итак, мой вопрос: должен ли я вместо этого сделать что-то вроде History.newItem("orderDetails?id="+id), а затем проанализировать токен истории в моем слушателе изменения значения? Если это так, есть ли наилучшая практика, API или библиотека для анализа и форматирования аргументов в строку таким образом?

Ответ 1

Да, это то, что вы должны делать. По-моему, нет библиотеки для облегчения этого процесса.

Немного советов, хотя: если это вообще возможно, вам следует избегать использования схемы, которая требует, чтобы вы использовали процентные escape-последовательности в строке элемента истории. Причина в том, что location.hash возвращается, когда location.href заканчивается, например #%[email protected]%40 зависит от браузера и браузера. Например, Chrome возвращает #%[email protected]%40; Firefox возвращает #<@@. Настройка location.hash может иметь похожие эффекты, специфичные для браузера.

Механизм маркера истории GWT опирается на location.hash и не нормализует эту разницу в поведении браузера. Конечным результатом является то, что если вы используете что-то, требующее процентных экранов, вы получите URL-адреса, которые не могут быть разделены между браузерами - это проблема, если на какой-либо другой странице вы хотите генерировать ссылки, которые переходят на определенное место в вашем GWT приложение, или если вы ожидаете, что пользователи будут обмениваться URL-адресами, которые связаны с вашим приложением GWT. (или когда пользователь устанавливает Chrome, импортирует закладки из Firefox, указывающие на определенные места внутри вашего webapp, и вдруг закладки не работают так, как они делали раньше)

Для паранойи, я бы не помещал в вашу токенную строку истории символы ?, #, &, %, < или >. Однако строки типа orderDetails/oid=12313378 должны быть точными и кросс-браузерными.

(Отредактировано, чтобы уточнить, что проблема, о которой я говорю, связана с тем, что идентичные URL-адреса работают в нескольких разных браузерах, а не в том, что метод маркеров истории работает вообще в каждом из разных браузеров)