2010-02-25 9 views
10

Tengo una página llamada Pedidos y una página llamada Detalles de pedido. Como se describe en el excelente MVP tutorial, estoy trabajando con History (con un ValueChangeListener central) y un HandlerManager "bus de eventos".¿Cómo usar el historial de GWT para pasar parámetros?

Tengo un controlador registrado para el evento que alguien hace clic en un pedido, que básicamente crea el OrderDetailPresenter, pasa el ID del pedido (que está contenido en ShowOrderDetailEvent) y luego llama al History.newItem("orderDetails").

Esto tiene un par de desventajas importantes: este paso de historia recién creado NO sabe qué ID de orden se pasó. Entonces, por ejemplo, si alguien marca la página de detalles del pedido (o retrocede y avanza en su navegador), ' Obtendré una página en blanco sin detalles de la orden.

Entonces mi pregunta es: ¿Debería hacer algo como History.newItem("orderDetails?id="+id), y luego analizar el token de historial en mi detector de cambios de valores? De ser así, ¿existe una mejor práctica, una API o una biblioteca para analizar y formatear argumentos en una cadena de esta manera?

Respuesta

9

Sí, eso es lo que debes hacer. Por lo que yo sé, no hay una biblioteca para facilitar esto.

Un poco de consejo, si es posible, debe evitar el uso de un esquema que requiera el uso de porcentajes de escape en la cadena de elementos de su historial. La razón es que lo que location.hash devuelve cuando location.href termina en, por ejemplo #%[email protected]%40 varía de un navegador a otro. Por ejemplo, Chrome devuelve #%[email protected]%40; Firefox devuelve #<@@. La configuración location.hash puede tener efectos similares específicos del navegador.

El mecanismo de token de Historial de GWT se basa en location.hash y no normaliza esta diferencia en el comportamiento del navegador. El resultado final es que si utiliza algo que requiere porcentajes de escape, obtendrá URL que no se pueden compartir entre los navegadores: este es un problema si en alguna otra página desea generar enlaces que salten a un punto específico dentro de su GWT. aplicación, o si espera que los usuarios compartan las URL que enlazan dentro de su aplicación GWT. (o cuando su usuario instala Chrome, importa sus marcadores de Firefox que apuntan a puntos particulares dentro de su aplicación web, y de repente los marcadores no funcionan como lo hacían antes)

Paranoia, evitaría poner cualquier ?, #, &, %, <, o > caracteres en su cadena de token de historial. Sin embargo, cadenas como orderDetails/oid=12313378 deberían estar bien, y entre navegadores.

(Editado para aclarar que el tema que estoy hablando se ocupa de tener direcciones URL idénticas funcionan en varios navegadores diferentes, no de tener la historia token de método de trabajo en absoluto en cada uno de los diferentes navegadores)

+0

En realidad GWT TENGA en cuenta las diferencias en los navegadores. Incluso funciona en torno a una serie de cuestiones diferentes que no se mencionan aquí. Entonces puedes usar cualquiera de los personajes mencionados. Si desea verificar esto, simplemente eche un vistazo a las clases 'com.google.gwt.user.client.impl.HistoryImpl ' en el archivo 'gwt-user.jar' (gwt 2.0). Y también hace la de/codificación para que pueda pasar el '@' y se ocupará de ello. –

+0

Suena genial. Observé que GMail hace exactamente esto también, si hago clic en una etiqueta, por ejemplo, la URL cambia a "... # inbox/labelname". Ellos URL codifican el nombre de la etiqueta, sin embargo, así que estoy haciendo lo mismo con URL.encode y URL.decode. – Epaga

+0

Solo para completar. Si usa 'History.newItem (..)' no debe decodificar/codificar, porque GWT ya lo hace por usted. De hecho, si lo haces, podría llevar a los problemas mencionados sobre Firefox. –

Cuestiones relacionadas