2010-02-25 2 views
10

У меня есть страница под названием Заказы и страница под названием OrderDetails. Как описано в превосходном MVP tutorial, я работаю с историей (с центральным ValueChangeListener) и «обработчиком событий» HandlerManager.Использование истории GWT для передачи параметров?

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

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

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

ответ

9

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

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

+0

Собственно GWT Учет различий в браузерах. Он даже работает с рядом различных проблем, не упомянутых здесь. Таким образом, вы можете использовать любой из указанных символов. Если вы хотите проверить это, просто взгляните на 'com.google.gwt.user.client.impl.HistoryImpl ' классы в файле 'gwt-user.jar' (gwt 2.0). И он также кодирует de/encoding, поэтому вы можете перейти в '@', и он позаботится об этом. –

+0

Звучит здорово. Я заметил, что GMail делает именно это, если я нажму на ярлык, например, URL изменится на «... # inbox/labelname». Однако они кодируют имя метки, поэтому я делаю то же самое с URL.encode и URL.decode. – Epaga

+0

Просто чтобы быть полным. Если вы используете 'History.newItem (..)', вы не должны декодировать/кодировать, потому что GWT уже делает это для вас. Фактически, если вы это сделаете, это может привести к проблемам, упомянутым в Firefox. –

Смежные вопросы