Использование GWT History для передачи параметров?
У меня есть страница с названием Orders и страница с названием OrderDetails. Как описано в отличном учебнике MVP, я работаю с History (с центральным ValueChangeListener) и HandlerManager с "шиной событий".
У меня зарегистрирован обработчик для события, когда кто-то нажимает на заказ, который в основном создает OrderDetailPresenter, передает идентификатор заказа (который содержится в ShowOrderDetailEvent), а затем вызывает History.newItem("orderDetails")
,
У этого есть пара основных недостатков: Этот недавно созданный шаг "История" НЕ знает, какой идентификатор заказа был передан. Так, например, если кто-то добавит страницу с информацией о заказе в закладки (или вернется в свой браузер), он получит пустой страница без деталей заказа.
Итак, мой вопрос: я должен вместо этого сделать что-то вроде History.newItem("orderDetails?id="+id)
, а затем проанализировать маркер истории в моем слушателе изменения значения? Если да, то есть ли лучший метод, API или библиотека для разбора и форматирования аргументов в строку таким образом?
1 ответ
Да, это то, что вы должны сделать. Насколько я знаю, нет библиотеки, чтобы сделать это проще.
Однако небольшой совет: если это вообще возможно, вам следует избегать использования схемы, которая требует от вас использовать процентные экранированные символы в строке элемента истории. Причина в том что location.hash
возвращается, когда location.href
заканчивается, скажем #%3C@%40
варьируется от браузера к браузеру. Например, Chrome возвращает #%3C@%40
; Firefox возвращается #<@@
, настройка location.hash
может иметь похожие браузерные эффекты.
Механизм токенов истории GWT основан на location.hash
и не нормализует эту разницу в поведении браузера. Конечным результатом является то, что если вы используете что-то, что требует процента выхода, вы получите URL, которые не могут быть разделены между браузерами - это проблема, если на какой-то другой странице вы хотите генерировать ссылки, которые переходят на определенное место в вашем GWT приложение, или если вы ожидаете, что пользователи будут обмениваться URL-адресами, на которые ссылается ваше приложение GWT (или когда ваш пользователь устанавливает Chrome, импортирует свои закладки из Firefox, которые указывают на определенные места в вашем веб-приложении, и внезапно закладки не работают, как раньше)
Для паранойи, я бы избегал ?
, #
, &
, %
, <
, или же >
символы в вашей строке токена истории. Тем не менее, строки, как orderDetails/oid=12313378
должно быть хорошо, и кросс-браузер.
(Отредактировано, чтобы пояснить, что проблема, о которой я говорю, связана с тем, чтобы идентичные URL-адреса работали в разных браузерах, а не с тем, чтобы метод маркера истории вообще работал в каждом из разных браузеров)