Использование GWT History для передачи параметров? - PullRequest
10 голосов
/ 25 февраля 2010

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

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

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

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

1 Ответ

9 голосов
/ 25 февраля 2010

Да, это то, что вы должны сделать. Насколько я знаю, нет библиотеки, которая облегчила бы это.

Однако небольшой совет: если это вообще возможно, вам следует избегать использования схемы, которая требует от вас использовать процентное экранирование в строке элемента истории. Причина в том, что то, что возвращается 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-адреса работали в разных браузерах, а не с тем, чтобы метод маркера истории вообще работал в каждом из разных браузеров)

...