2011-10-21 31 views
5

En el código siguiente, la acción jsf html commandButton se llama perfectamente. Pero la acción CommandButton de Primefaces no se llama.PrimeFaces CommandButton Acción no llamada dentro de Composite

<ui:component   
       xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:p="http://primefaces.prime.com.tr/ui" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute 
      name="managedBean"   
      type="java.lang.Object" 
      required="true">      
     </composite:attribute> 
    </composite:interface> 

    <composite:implementation> 
     <f:view contentType="text/html"> 
      <h:form id="componentes"> 
       <h:panelGrid columns="3"> 
        <h:panelGroup>    
         <h:outputText 
           escape = "false" 
           value = "#{cc.attrs.managedBean['value']}"  
          rendered = "#{!cc.attrs.managedBean['editing']}"/> 
         <p:editor 
          widgetVar = "editor" 
           value = "#{cc.attrs.managedBean.value}" 
          rendered = "#{cc.attrs.managedBean.editing}"/> 
        </h:panelGroup> 
        <!-- ACTION IS CALLED -->         
        <h:commandButton 
           action = "#{cc.attrs.managedBean.toogleEditing}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 

            <!-- ACTION IS NOT CALLED -->   
        <p:commandButton 
           action = "#{cc.attrs.managedBean.toogleEditing}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 
       </h:panelGrid> 
      </h:form>      
     </f:view> 
    </composite:implementation> 
</ui:component> 

Si lugar el mismo código está fuera de un compuesto (una página normal XHTML), ambos funcionan bien:

<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html 
    xml:lang="pt" 
     lang="pt" 
     xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.prime.com.tr/ui"> 

    <h:head id="head"> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     <title>Item de Texto</title> 
    </h:head> 
    <h:body id="body">   
     <f:view contentType="text/html"> 
      <h:form id="componentes"> 
       <h:panelGrid columns="3"> 
        <h:panelGroup>    
         <h:outputText 
           escape = "false" 
           value = "#{editableHTMLText.value}" 
          rendered = "#{!editableHTMLText.editing}"/> 
         <p:editor 
          widgetVar = "editor" 
           value = "#{editableHTMLText.value}" 
          rendered = "#{editableHTMLText.editing}"/> 
        </h:panelGroup> 

            <!-- ACTION IS CALLED -->       
        <h:commandButton 
           action = "#{editableHTMLText.toogleEditing}" 
           value = "#{editableHTMLText.editing?'Back':'Edit'}" 
           update = "componentes"/> 

            <!-- ACTION IS CALLED --> 
        <p:commandButton 
           action = "#{editableHTMLText.toogleEditing}" 
           value = "#{editableHTMLText.editing?'Back':'Edit'}" 
           update = "componentes"/> 
       </h:panelGrid> 
      </h:form>      
     </f:view> 
    </h:body> 
</html> 

Este es el código de frijol:

import java.io.Serializable; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 


@ManagedBean 
@SessionScoped 
public class EditableHTMLText implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8439126615761864409L; 

    private String    value    = "Test<br>of<br>HTML<br>text<br><b>ITEM</b><br>"; 
    private boolean    editing    = false; 


    public void toogleEditing(){ 

     this.setEditing(!this.isEditing()); 
     System.out.println("Editing State: " + this.editing); 
    } 


    public String getValue(){ 

     return value; 
    } 


    public void setValue(String value){ 

     this.value = value; 
    } 


    public boolean isEditing(){ 

     return editing; 
    } 


    public void setEditing(boolean editing){ 

     this.editing = editing; 
    } 

} 

¿Alguna sugerencia?

Respuesta

5

Cuando utilizó el componente compuesto, ¿ya estaba colocado en una etiqueta h: form? Cuando tiene formularios anidados, la acción del botón de comando no se desencadena.

Otro problema puede ser las partes ajax que usted está tratando. El botón Primefaces tiene el atributo de actualización, pero el JSF estándar no tiene eso. Siempre hará una actualización completa de la página (excepto cuando está anidada en o f: etiqueta ajax dentro de ella)

0

Puede intentar insertar el atributo ajax = "false" en p: commandButton.

0

También solucioné este problema y probé tus códigos, parece que Primefaces no puede advertirte errores de validación en el mismo "xhtml", pero en otros panelGrids, es posible que necesites un parentGrid para encapsular todas las cuadrículas de tu formulario .

Si llena el formulario completo por completo, verá que sus PrimeFaces acción commandButton está llamada, de lo contrario sería en silencio "digerir" los errores de validación que pueda tener.

1

también tuve problemas con CommandButtons no disparo. En mi caso, los requisitos ajax y no ajax no funcionaron. 1. como se describió anteriormente - asegúrese de eliminar todos los formularios en el formulario. fácil de hacer con el uso de compuestos. 2. si tiene varios botones, intente utilizar el indicador "proceso". Ayudado en mi caso.

<p:commandButton id="submitButton" value="Submit" type="submit" 
    actionListener="#{bean.save}" 
    update="message" 
    process="txtComment, @this" 
    icon="ui-icon-disk"/> 

process="txtComment, @this" ejecuta el método setter de inputText con id txtComment y el método commandButton.

10

Hoy me golpeó este mismo problema con PrimeFaces 5.1. En mi caso, no tenía formularios anidados y ya estaba configurando el atributo process en el p:commandButton con los elementos del formulario que quería que se procesaran. Sin embargo, esto no funcionó aún.

La "solución" fue añadir @this a la lista de componentes para procesar, así:

<p:commandButton process="myFormField1 myFormField2 @this">

Sin @this (que generalmente no se necesita, ya que el botón no debe necesitar ser procesada/validada) he encontrado ninguna manera de hacer que cualquiera de estos para trabajar dentro de un compuesto:

  • <p:commandButton action="#{bean.myAction}"...>
  • <p:commandButton type="button"> con anidada <p:ajax event="click" action="#{bean.myAction}"...>
  • <p:commandButton type="button" onclick="myAction()"> con asociado <p:remoteCommand name="myAction" action="#{bean.myAction}">

Por depuración de la aplicación, vi que la validación y actualización de fases modelo fueron ejecutados correctamente, pero a continuación, en la fase de aplicación de invocación ningún caso en cola estaba presente y por lo tanto no la acción fue realizada. De hecho, pude especificar cualquier cosa que me gustara dentro de los valores de atributo action y actionListener de <p:commandButton> sin tener que presentar PrimeFaces o JSF de ninguna manera.

Estos, en cambio, no funcionan como deberían, pero que no tiene tratamiento parcial en su lugar, por lo que no puede ser una solución viable:

  • <p:commandButton action="#{bean.myAction}" ajax="false"...>
  • <p:commandButton type="button"...> con anidada <f:ajax event="click" action="#{bean.myAction}"...>

Debe ser un error PrimeFaces.

+0

botón no se dispara, si no se procesa. que tiene sentido. – erencan

+1

No, ya que el atributo "proceso" indica qué * otros * campos deben procesarse/enviarse. No es necesario configurar "@this" en el atributo de proceso para botones fuera de un compuesto. Y, si lo fuera, sería al menos "redundante". –

+0

Ojalá pudiera votar esto más de una vez. Esta es la respuesta correcta, o debería decir @ esto. Incluso en 2018 bajo las caras de la prima 6. Nunca tuve un problema con p: commandButton's disparando hasta que puse uno en un compuesto. –

0

Para agregar a las respuestas anteriores, para que estén completas.

Uno de los cuestión no prevista en las respuestas anteriores es la Targets atributo falta en composite:interface

A partir de los documentos de JSF atribuyen

objetivos: Si este elemento tiene un método de firma atributo, el valor del atributo de los destinos debe interpretarse como una lista separada de los identificadores del cliente (no de la pestaña) (relativa al componente de nivel superior) de los componentes dentro del < compuesto: implementación > sección. El espacio se utiliza como el delimitador para la compatibilidad con los tipos de datos IDREFS y NMTOKENS del esquema XML. Cada entrada de la lista se debe interpretar como la identificación de un componente interno al que se debe aplicar MethodExpression desde la etiqueta de componente compuesto en la página de uso. Si este elemento tiene un atributo de firma de método, pero no un atributo de destino, el valor del atributo de nombre se utiliza como la entrada única en la lista . Si el valor del atributo de nombre no es uno de los valores especiales enumerados en la descripción del atributo de nombre, los objetivos (o su valor derivado) no necesitan corresponderse con el ID de un componente interno .

<cc:interface> 
    <cc:attribute name="value" /> 
    <cc:attribute name="action" targets="buttonId" /> 
    <cc:attribute name="actionListener" targets="buttonId" /> 
</cc:interface> 
<cc:implementation> 
    <p:commandButton id="buttonId" value="#{cc.attrs.value}" /> 
</cc:implementation> 

@source: https://stackoverflow.com/a/19680483/1850844

Cuestiones relacionadas