2012-02-08 26 views
7

tengo el siguiente código en JSF-2 Mojarra 2.0.8 se ejecuta en Tomcat 7Cómo establecer el valor booleano a un 'Sí' o 'No' h: selectOneRadio

<h:panelGrid id="yesNoRadioGrid"> 
<h:panelGrid columns="2" rendered="#{user.yesNoRadioGridFlag}"> 
    <h:outputText id ="otherLbl" value="Select Yes or No"></h:outputText> 
    <h:selectOneRadio id="yesNoRadio" value ="#{user.yesNoRadio}"> 
     <f:selectItems value="#{user.choices}"/>      
     <f:ajax execute="@form" render="userDetailsGrid "></f:ajax> 
    </h:selectOneRadio> 
</h:panelGrid> 
</h:panelGrid>  
<h:message for ="yesNoRadio"> </h:message> 
<h:panelGrid id="userDetailsGrid"> 
<h:panelGrid columns="2" rendered="#{user.yesNoRadio}"> 
    <h:outputLabel>Name :</h:outputLabel> 
    <h:inputText id="customerName" value="#{user.customerName}"></h:inputText> 
    <h:outputLabel>Salary: </h:outputLabel> 
    <h:inputText id="customerSalary" value="#{user.customerSalary}"></h:inputText> 
</h:panelGrid> 
</h:panelGrid> 

Mis managedBean contienen siguiente

private enum Choice { 

    Yes, No; 
    } 
private Choice yesNoRadio; 
public Choice[] getChoices() { 
    return Choice.values(); 
    } 
public Choice getYesNoRadio() { 
    return yesNoRadio; 
} 
public void setYesNoRadio(Choice yesNoRadio) { 
    this.yesNoRadio = yesNoRadio; 
} 

¿Cómo puedo hacer que mi 'userDetailsGrid' basado en el valor booleano (user.yesNoRadio) seleccionada en

me encontré con un workarround mediante la adición siguiente en mi mangedbean

private Boolean yesNoRadio; 
public SelectItem[] getMyBooleanValues() { 
    return new SelectItem[] {  
    new SelectItem(Boolean.TRUE, "Yes"), 
    new SelectItem(Boolean.FALSE, "No")  
    }; 
} 

y cambiar mi punto de vista a

<h:selectOneRadio id="yesNoRadio" value ="#{user.yesNoRadio}"> 
    <f:selectItems value="#{user.myBooleanValues}" />     
    <f:ajax execute="@form" render="userDetailsGrid "></f:ajax> 
</h:selectOneRadio> 

Respuesta

4

También puede simplemente verifique el valor enum en el atributo rendered. Las enumeraciones se evalúan como cadenas en EL, por lo que puede hacer una comparación de cadenas simple. De esta manera puedes conservar tu código original.

<h:panelGrid columns="2" rendered="#{user.yesNoRadio == 'Yes'}"> 

Por cierto, que tal vez realmente desea utilizar en lugar de execute="@this"execute="@form" (o simplemente eliminarlo por completo, el valor predeterminado es @this ya). El execute="@form" procesará el formulario entero y por lo tanto también activará la validación allí donde quizás no desee.

+0

Sí ... es lo que estaba buscando. Gracias BalusC. Soy nuevo en JSF y realmente aprecio sus comentarios sobre el uso del atributo execute. Una pregunta, tengo el botón de comando y en el que no quiero que se active la validación, entonces eliminé el atributo de ejecución del botón de comando, pero el evento de acción no se activó en esa situación. ¿Cuál podría ser la razón?. – jvG

14

utilizar un simple valor booleano en su respaldo de frijol:

private Boolean choice; 
// getter and setter 

Y en el facelet:

<h:selectOneRadio id="yesNoRadio" value ="#{user.choice}"> 
    <f:selectItem itemValue="#{false}" itemLabel="No" /> 
    <f:selectItem itemValue="#{true}" itemLabel="Yes"/> 
    <f:ajax execute="@form" render="userDetailsGrid "></f:ajax> 
</h:selectOneRadio> 
.. 
<h:panelGrid id="userDetailsGrid"> 
    <h:panelGrid columns="2" rendered="#{user.choice}"> 
    .. 
    </h:panelGrid> 
    .. 
</h:panelGrid> 
+0

Gracias Matt! , Siento que la vista se está volviendo un poco voluminosa con esos valores booleanos directos y cada elemento seleccionado. ¿Ve algún inconveniente posible en el workarround mencionado anteriormente con la ayuda de un SelectItem público [] getMyBooleanValues ​​()? – jvG

+0

No, no veo inconvenientes. –

Cuestiones relacionadas