2012-02-16 20 views
5

Tengo un formulario que contiene un menú desplegable y dos campos de entrada.atributo requerido de inputText debe depender del valor presentado de otro componente

<h:selectOneMenu /> 
<h:inputText /> 
<h:inputText /> 

Me gustaría hacer que el atributo requerido de los campos de entrada sea condicional dependiendo del valor seleccionado del menú desplegable. Si el usuario elige el primer elemento del menú desplegable, entonces los campos de entrada deben ser obligatorios. Si el usuario elige el segundo elemento, entonces no serían necesarios.

¿Cómo puedo lograrlo?

Respuesta

8

Simplemente enlace el menú desplegable a la vista y compruebe directamente su valor en el atributo required.

<h:selectOneMenu binding="#{menu}" value="#{bean.item}"> 
    <f:selectItem itemValue="first" itemLabel="First item" /> 
    <f:selectItem itemValue="second" itemLabel="Second item" /> 
</h:selectOneMenu> 

<h:inputText value="#{bean.input1}" required="#{menu.value eq 'first'}" /> 
<h:inputText value="#{bean.input2}" required="#{menu.value eq 'first'}" /> 

Tenga en cuenta que el ejemplo binding es como está. No lo configure en absoluto en una propiedad de frijoles aquí. Consulte también How does the 'binding' attribute work in JSF? When and how should it be used?

También tenga en cuenta que el orden de los componentes es significativo. Si el menú está ubicado debajo de las entradas en el árbol, use #{menu.submittedValue eq 'first'} en su lugar. O bien, si desea ser independiente de eso, use #{param[menu.clientId] eq 'first'} en su lugar.

+0

Cuando se envía el formulario , el valor selectOneMenu no tendrá aplicado el nuevo valor cuando se produzca la validación. El atributo 'immediate' en la selección puede darle la vuelta. – McDowell

+0

O mediante el enlace de componentes, el ejemplo anterior asume que el componente se coloca antes de las entradas. – BalusC

+0

Parece ser una solución fácil, pero desafortunadamente no funciona. El "menu.value" es nulo, aunque el atributo "inmediato" se estableció en true para selectOneMenu – user1213679

4

Asumiendo que están utilizando JSF 2.0: Deje que su SelectOneListBox ejecutar con el Ajax y volver a representar los campos de entrada en el cambio del cuadro de lista:

Un boceto rápido:

<h:selectOneMenu value="#{myBean.myMenuValue}"> 
    <f:ajax render="input1"/> 
    .. 
</h:selectOneMenu> 

<h:inputText id="input1" value="#{myBean.myInputValue}" 
      required="#{myBean.myMenuValue == 'firstEntry'}" /> 
Cuestiones relacionadas