2010-09-07 11 views
7

En mi página JSF tengo un cuadro combinado que actualiza una tabla cuando se selecciona un elemento del cuadro combinado.JSF Actualizaciones de Ajax hace que commandLink falle en el primer clic

La tabla contiene elementos con un enlace de edición.

El problema es cuando la tabla se cambia por el cuadro combinado que necesita hacer clic dos veces en el enlace para ir a la página. El primer clic simplemente actualiza la página.

Aquí es el XHTML:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <body> 
     <ui:composition template="/template.xhtml"> 
      <ui:define name="windowTitle">Comment packages</ui:define> 
      <ui:define name="content"> 
       <h3>Select the package to comment.</h3> 
       <h:form prependId="false"> 
        Section: 
        <h:selectOneMenu id="selectSection" value="#{platformService.currentSection}"> 
         <f:ajax render=":list-packages" /> 
         <f:selectItems value="#{platformService.releasePlatform.sections}" /> 
        </h:selectOneMenu> 
       </h:form> 
       <p/> 
       <h:panelGroup id="list-packages"> 
        <h:dataTable id="packageList" var="package" value="#{packageService.packages}" border="1" > 
         <h:column> 
          <f:facet name="header">Package name</f:facet> 
          #{package.name} 
         </h:column> 
         <h:column> 
          <h:form> 
           <h:commandlink action="#{commentService.commentPackage}" value="Comment"> 
            <f:param name="packageName" value="#{package.name}" /> 
           </h:commandLink> 
          </h:form> 
         </h:column> 
        </h:dataTable> 
       </h:panelGroup> 
      </ui:define> 
     </ui:composition> 
    </body> 
</html> 

También he probado con commandButton pero también hay que hacer doble clic en el botón.

Estoy ejecutando JSF 2.0.1-FCS en Maven/Jetty.

+0

¿Por qué hay ": list-packages" no "list-packages" en f: atributo de renderizado ajax? ¿Tal vez éste es el problema? ¿Tal vez la mesa no se entrega? – amorfis

+1

el ':' se debe a que el componente para representar está fuera del formulario. http://ocpsoft.com/java/jsf2-java/how-to-jsf-2-0-render-components-outside-of-the-form/ La tabla se actualiza/representa correctamente pero los enlaces en el la tabla debe hacerse clic dos veces para ir a la página. – Anthony

Respuesta

4

Funciona cuando coloca la tabla dentro de un solo <h:form>. Retire el interior <h:form> de la columna y reemplace <h:panelGroup id="list-packages"> por <h:form id="list-packages">.

No estoy seguro de cómo y por qué se produce este problema (requiere más tiempo para investigar) pero probablemente esté relacionado con el hecho de que el estado de la tabla es importante para saber qué fila se seleccionó.

2

Es muy probable que este problema se deba a este JSF bug donde no se puede tener un objetivo ajax que contenga un formulario que se actualice desde otro formulario. El problema se trata como un problema de especificación y se rastrea here. El informe de error tiene una solución que implica una edición de jsf.js si te gusta vivir al límite.

Con el uso de ajax y la capacidad de controlar lo que se envía al servidor con execute = Personalmente creo que hay un buen argumento para usar un único formulario por página (excepto en circunstancias excepcionales como cargar archivos y dialogar) implementaciones de caja), y no se deja atrapar por errores fáciles de olvidar para nombrar contenedores y problemas como este.

Cuestiones relacionadas