2012-09-22 14 views
7

Estoy usando JSF 2 con PrettyFaces y también las etiquetas <h:link> y <f:param> ampliamente para obtener páginas de favoritos (Es genial olvidar finalmente todas esas solicitudes POST en una aplicación JSF).Refrescante URL con JSF solicitud de ajax

Sin embargo, algunos de estos enlaces solo cambian una pequeña parte de la página (principalmente cuando el usuario permanece en la misma vista), por lo que es mejor enviar solicitudes ajax en su lugar. Sin embargo, <f:ajax> no se puede utilizar con <h:link>, solo <h:commandlink>. También puedo enviar parámetros de muchas maneras con un enlace de comando, pero en este caso la URL permanece igual después de la solicitud. Por lo tanto, no está sincronizado con el contenido de la página y no se puede actualizar.

He visto sitios que usan enlaces que envían una especie de mezcla de solicitudes GET y ajax (que apuntan a una nueva url mientras se modifica la página con ajax), pero hasta ahora no he encontrado ninguna solución.

¿De alguna manera puedo actualizar la URL con jsf después de que finaliza la solicitud de Ajax (o cuando el usuario hace clic)? ¿O debo usar alguna biblioteca externa de JS?

EDIT: La biblioteca JS que se necesita aquí es la nueva API de Historial de JavaScript. More info. Supongo que JSF no usa esta API actualmente. Pero todavía estoy interesado en este tema desde el punto de vista de un desarrollador de JSF.

Además, ¿está previsto un lanzamiento futuro de JSF? La combinación de <f:ajax> con <h:link> sería una solución perfecta.

+0

Lo he visto hace unos meses para OmniFaces. Desafortunadamente, esto no es barato/trivial. La misma URL modificada debería poder devolver exactamente el estado de vista JSF deseado, incluidos todos los cambios ajax realizados por las devoluciones de datos mediante una única solicitud GET simple. Toda la información necesaria para lograr esto de una manera que abarque toda la aplicación (independiente de la sesión) hace que el URL GET sea muy extenso. Hay formas de acortar la URL, pero aún así ... Y aún no tomo en cuenta las características específicas de la biblioteca de componentes. – BalusC

+0

Gracias por la respuesta. Aunque no lo entiendo completamente. Creo que debería ser responsabilidad del desarrollador establecer una URL que devuelva exactamente la misma página cuando se renueve; las vistas deben manejar los atributos de solicitud, etc. De hecho, ya lo hice, ya que '' genera un enlace GET que no es ajax. - Lo único que quiero es enviar una solicitud de AJAX en su lugar y establecer la URL a la generada anteriormente por ''. Podría ser '' o cualquier otra cosa, el punto es que debería funcionar así. – apcuk

+0

Si el propósito es la navegación pura página a página, entonces sería más simple de implementar. Pero el '' generalmente se usa para muchas otras cosas más útiles que solo la navegación. * Esa * parte no es trivial. – BalusC

Respuesta

-1

<f:ajax> tiene el atributo onevent. Toma el nombre de la función javascript que se llamará después de que ajax request finalice con éxito. Por lo tanto, es posible agregar la función js que navegará a la URL requerida después de que finalice la llamada ajax. Algo como:

 <h:commandLink id="testButton" 
         value="Test"> 
      <f:ajax event="action" 
        execute="@form" 
        render="@none" 
        listener="#{myBean.testButtonClickedHandler}" 
        onevent="navigate"/> 
     </h:commandLink> 

<script type="text/javascript"> 
    function navigate() { 
     window.location.href = "required url"; 
    } 
</script> 
Cuestiones relacionadas