2010-02-25 12 views
10

Mam stronę o nazwie Zamówienia i stronę o nazwie "Szczegóły zamówienia". Jak opisałem w znakomitym MVP tutorial pracuję z Historią (z centralną ValueChangeListener) i "HandlerManager" magistrali zdarzeń.Korzystanie z historii GWT do przekazywania parametrów?

Mam zarejestrowanego handlerka dla zdarzenia, w którym ktoś kliknie zamówienie, które zasadniczo tworzy OrderDetailPresenter, przekazuje identyfikator zamówienia (który jest zawarty w ShowOrderDetailEvent), a następnie wywołuje History.newItem("orderDetails").

Ma to kilka poważnych wad: ten nowo utworzony krok historii NIE DOTYCZY, który identyfikator zamówienia został przekazany. Na przykład, jeśli ktoś umieści zakładkę na stronie szczegółów zamówienia (lub wróci do przeglądarki w przód), Otrzymam pustą stronę bez szczegółów zamówienia.

Moje pytanie brzmi: czy zamiast tego powinienem zrobić coś takiego jak History.newItem("orderDetails?id="+id), a następnie przeanalizować token historii w moim odbiorniku zmian wartości? Jeśli tak, czy istnieje najlepsza praktyka, interfejs API lub biblioteka do analizowania i formatowania argumentów na łańcuch znaków w ten sposób?

Odpowiedz

9

Tak, właśnie to powinieneś zrobić. Nie ma, o ile mi wiadomo, żadnej biblioteki, która ułatwiłaby to.

Trochę porady: jeśli to w ogóle możliwe, powinieneś unikać używania schematu, który wymaga użycia procentowych znaków ucieczki w ciągu znaków historii. Powodem jest to, że to, co location.hash powraca, gdy kończy się location.href, np. #%[email protected]%40, różni się w zależności od przeglądarki. Na przykład Chrome zwraca #%[email protected]%40; Firefox zwraca #<@@. Ustawienie location.hash może mieć podobne efekty specyficzne dla przeglądarki.

Mechanizm historii tokenów GWT opiera się na location.hash i nie normalizuje tej różnicy w zachowaniu przeglądarki. Końcowym rezultatem jest to, że jeśli użyjesz czegoś, co wymaga procentowych ucieczek, otrzymasz adresy URL, których nie można udostępnić w różnych przeglądarkach - jest to problem, jeśli na innej stronie chcesz generować linki przeskakujące do określonego miejsca w GWT lub jeśli chcesz, aby użytkownicy udostępniali adresy URL, do których prowadzą linki w Twojej aplikacji GWT. (lub gdy twój użytkownik instaluje Chrome, importuje swoje zakładki z Firefoksa, które wskazywały na konkretne miejsca wewnątrz twojej aplikacji internetowej i nagle zakładki nie działają tak, jak poprzednio). #, &, %, < lub > znaków w ciągu znaków historii. Jednak ciągi takie jak orderDetails/oid=12313378 powinny być w porządku, a także w różnych przeglądarkach.

(Edytowane w celu wyjaśnienia, że ​​kwestia mówię to mając do czynienia z identycznymi URL pracować w wielu różnych przeglądarkach, a nie posiadania historii tokena metody pracy w ogóle w każdym z różnych przeglądarek)

+0

Właściwie GWT UWAgA bierze pod uwagę różnice w przeglądarkach. Działa nawet w wielu różnych kwestiach nie wymienionych tutaj. Możesz więc użyć dowolnej z wymienionych postaci. Jeśli chcesz to sprawdzić, spójrz na klasy 'com.google.gwt.user.client.impl.HistoryImpl ' w pliku 'gwt-user.jar' (gwt 2.0). Ma również kodowanie/deszyfrowanie, dzięki czemu można przekazać w '@' i zajmie się nim. –

+0

Brzmi świetnie. Zauważyłem, że GMail również to robi, jeśli kliknę na przykład etykietę, adres URL zmieni się na "... inbox/labelname". Jednak URL kodują nazwę etykiety, więc robię to samo z URL.encode i URL.decode. – Epaga

+0

Po prostu gotowe. Jeśli użyjesz 'History.newItem (..)' nie powinieneś dekodować/kodować, ponieważ GWT już to robi. W rzeczywistości, jeśli to zrobisz, może to prowadzić do wspomnianych problemów dotyczących Firefoksa. –

Powiązane problemy