2012-02-16 8 views
5

Ho un modulo che contiene un menu a discesa e due campi di input.l'attributo obbligatorio di inputText dovrebbe dipendere dal valore presentato di un altro componente

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

desidero rendere l'attributo richiesto dell'ingresso fields condizionale seconda del valore selezionato della discesa. Se l'utente sceglie il primo elemento del menu a discesa, devono essere richiesti i campi di input. Se l'utente sceglie il secondo elemento, allora quelli non sarebbero richiesti.

Come posso ottenere questo risultato?

risposta

8

Basta associare il menu a discesa alla vista e controllarne direttamente il valore nell'attributo 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'}" /> 

Si noti che l'esempio binding è così com'è. Non impostarlo assolutamente su una proprietà bean qui. Vedi anche How does the 'binding' attribute work in JSF? When and how should it be used?

Si noti inoltre che l'ordine dei componenti è significativo. Se il menu si trova sotto gli input nell'albero, utilizzare invece #{menu.submittedValue eq 'first'}. O se vuoi essere indipendente da quello, usa invece #{param[menu.clientId] eq 'first'}.

+0

Quando il modulo viene inviato , il valore selectOneMenu non avrà il nuovo valore applicato quando si verifica la convalida. L'attributo 'immediate' sulla selezione può aggirare questo. – McDowell

+0

O per associazione di componenti, l'esempio precedente presuppone che il componente sia posizionato prima degli input. – BalusC

+0

Sembra essere una soluzione semplice ma sfortunatamente non funziona. Il "menu.value" è nullo se l'attributo "immediato" è impostato su true per selectOneMenu – user1213679

4

si Supponendo che si utilizza JSF 2.0: Lasciate che il vostro SelectOneListBox eseguire con Ajax e ri-renderizzare i campi di immissione sul cambiamento della casella di riepilogo:

un rapido schizzo:

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

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