2012-05-18 7 views
6

Tuve un comportamiento extraño en mi aplicación. Los botones de comando comienzan a invocar acciones en el segundo golpe. Primero, nada sucede. Tiene efecto sobre firefox y cromo, pero en epifanía funciona como de costumbre.Los botones de comando invocan acciones en la segunda inserción (jsf)

Mi entorno: - Ubuntu 11.04 - GlassFish 3.1.1 - 2.X JSF - PrimeFaces 3.2 - Firefox 12.0 - epifanía ejemplo 2.30.6

Código:

<ui:define name="content"> 
     <h:form id="form"> 
      <h:panelGrid id="panelGrid" columns="3"> 

       <h:outputText value="#{msg.fieUserName}:"/> 
       <h:inputText id="name" value="#{userBb.editedUser.username}" /> 
       <h:message for="name" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fieUserDescription}:"/> 
       <h:inputText id="description" value="#{userBb.editedUser.description}" /> 
       <h:message for="description" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fieUserPassword}:"/> 
       <h:inputSecret id="password" value="#{userBb.editedUser.password}" redisplay="true"/> 
       <h:message  for="password" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fieUserRights}:"/> 
       <p:selectOneMenu id=  "rights" 
           value= "#{userBb.editedUserGroup}" 
           converter="#{pGroupOfUsersConverter}"> 
        <f:selectItems 
         value ="#{groupDao.findAll()}" 
         var  ="row" 
         itemLabel="#{groupDao.rightsDescription(row.id)}" 
         itemValue="#{row.groupname}" 
         > 
        </f:selectItems> 
       </p:selectOneMenu> 
       <h:message for="rights" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fiePorofolioName}:" rendered="#{userBb.chosenNew}"/> 
       <h:inputText id="portName" value="#{userBb.portfelForNewUser.nazwa}" rendered="#{userBb.chosenNew}"> 
        <f:validateBean disabled="true" /> 
       </h:inputText> 
       <h:message for="portName" styleClass="error_msg" rendered="#{userBb.chosenNew}"/> 

       <h:outputText value="#{msg.fiePotofolioCurrency}:" rendered="#{userBb.chosenNew}"/> 
       <p:selectOneMenu id=  "waldep" 
           value= "#{userBb.portfelForNewUser.walutaDepozytowa}" 
           converter="#{igConverter}" 
           rendered= "#{userBb.chosenNew}" 
           > 
        <f:selectItems value= "#{igDao.waluty}" 
            var=  "row" 
            itemLabel="#{row.nazwa}"/> 
       </p:selectOneMenu> 
       <h:message for="waldep" styleClass="error_msg" rendered="#{userBb.chosenNew}"/> 

      </h:panelGrid> 
      <h:panelGrid columns="2"> 
       <h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}" /> 
       <h:commandButton value="#{msg.butSave}" action="#{userBb.formEdit()}" rendered="#{!userBb.chosenNew}"/> 
       <h:commandButton value="#{msg.butBack}" action="#{userBb.formBack()}"/> 
      </h:panelGrid> 
     </h:form> 
    </ui:define> 

En este ejemplo, el método userBb.formCreate() se invoca solo al hacer clic en el botón de comando aunque el botón esté visible. Cuando los campos no se llenan correctamente, aparecen los mensajes apropiados junto a ellos, pero ... ¡solo con un segundo clic! ¿Algún consejo?

Echa un vistazo a los puntos desde: this advice, pero solución no encontrada.

+0

¿Estás 100% seguro de que no es los puntos 5.. y 7 de esa respuesta? No lo ha desmentido explícitamente en su código. – BalusC

+0

Lo he comprobado. Primero, aseguré que el atributo renderizado está bien, y lo configuré adicionalmente en @PostConstruct init(). Segundo cambié el id. de form a userForm y agregado al botón de comando Todavía funciona para la segunda acción en firefox y cromo y para el primero en ephipany. Trataré de averiguarlo, probablemente hice algo mal – Zbyszek

Respuesta

7

Ok, encontré lo que estaba mal. Entonces:

Apariencia del problema: Tengo una página para los datos del usuario. Algunos elementos de entrada y botones de comando. Al hacer clic en el botón "Crear", se verifican los datos de entrada. Si los datos están correctos, se crea el usuario y aparece la tabla de usuarios, o cuando hay errores, aparecen mensajes de error y el usuario permanece en la misma página: enter image description here

Encontré un comportamiento errático. No ha sucedido nada en el primer clic (acción), solo la segunda acción y las siguientes tienen un efecto. Pero. Este comportamiento era relacionado al tipo de navegador que uso.

Todas las acciones tienen lugar desde el primer clic, en webrowers: epiphany y konqueror. Aunque en Firefox y cromo observé este comportamiento errático que describí anteriormente. El código para un botón de comando era:

<h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}"/> 

Distintos comportamientos en diferentes webbrowers.

La causa. La causa fue enumerada por @Balusc en su note, que leí aproximadamente la primera vez. De hecho, fue pt. 7.

La solución. He tratado de cambiar la declaración botón de esta manera:

<h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}"> 
    <f:ajax render="userForm"/> 
</h:commandButton> 

donde formUsuario era debida identificación de h: form. Ningún resultado, solo el segundo y los siguientes clics tienen un efecto: muestra mensajes de error.

Cambié el botón de comando de declaración de la página anterior, que invocaba la página de comportamiento errático. Originalmente era:

<p:commandButton value="#{msg.butNew}" action="#{userBb.actionNew()}"/> 

primefaces botón de comando. Y eso fue todo, como escribió Balusc: "Si uno de los padres con el botón UICommand es prestado/actualizado por una solicitud ajax de antemano, entonces la primera acción siempre fallará."

Así que cambió declaración a:

<p:commandButton value="#{msg.butNew}" action="#{userBb.actionNew()}" ajax="false"/> 

Y eso es todo Funciona bien en cualquier navegador, para la primera acción

Cuestiones relacionadas