2013-04-24 60 views
1

球員我需要更新另一個selectOneMenu當用戶選擇一個選項combo_pedido_tipoplm selectOneMenu。如果用戶選擇「選擇一個」選項,則需要清除第二個選項。如何正確使用f:selectItem和JSF2?

我已經嘗試了一切,但我不能調用我的actionListener後,我選擇了選擇「我選擇」(Selecione)從我的h:selectOneMenu。

XHTML

<h:selectOneMenu id="combo_pedido_tipoplm" value="#mBeanManterPedido.tipoPlacaMaeFiltro}" required="true" disabled="#{!mBeanManterPedido.pedidoValido or mBeanManterPedido.clonado}"> 
    <f:selectItem itemLabel="#{msgTemplate.lblSelecione}" /> 
    <f:selectItems value="#{mBeanManterPedido.selectItemsTipoPlacaMae}" /> 
    <p:ajax event="change" listener="#{mBeanManterPedido.tipoPlacaMaeChange}" process="@this"/> 
</h:selectOneMenu> 

的MBean

private TipoPlacaMae tipoPlacaMaeFiltro; 

public void popularTipoPlacaMae() { 
     this.selectItemsTipoPlacaMae = new ArrayList<SelectItem>(); 
     for (TipoPlacaMae tipoplaca : TipoPlacaMae.values()) { 
      this.selectItemsTipoPlacaMae.add(new SelectItem(tipoplaca, tipoplaca.getNome())); 
     } 
     UtilsCommon.orderByLabel(selectItemsTipoPlacaMae); 
    } 

public void tipoPlacaMaeChange(AjaxBehaviorEvent e) { 
     // deseleciona a PlacaMae atualmente selecionada. 
     pedido.setPlacaMae(null); 
     limparDadosPedido(); 
     popularPlacaMae(); 
    } 

,如果我選擇選項「之所以選擇一個」我有一個驗證錯誤,因爲這是selectOneMenu用於重新查詢和我的tipoPlacaMaeFiltro二傳手不叫。

<?xml version='1.0' encoding='UTF-8'?> 

{ 「validationFailed」:真正}

我能做些什麼呢?

回答

1

對於那些有相同疑問的人。

您需要在您的ajax請求中放置immediate =「true」。

<h:selectOneMenu id="id" 
        value="#{mbean.value}" required="#{mbean.required}" 
        converter="#{mbean.converter}"> 
        <f:selectItem itemLabel="Chose one" /> 
        <f:selectItems value="#{mbean.selectItems}" /> 
        <f:ajax event="valueChange" listener="#{mbean.onchange}" 
         render="second_combo" 
         immediate="true"> 
        </f:ajax> 
       </h:selectOneMenu> 

後,在ManagedBean你需要實現,但不同的處理聽衆

public void onchange(AjaxBehaviorEvent e) { 
    YourClass o = getSelectedValue(e); 
} 


private YourClass getSelectedValue(AjaxBehaviorEvent e) 
{ 
    if (e != null) 
    { 
     UISelectOne select = (UISelectOne) e.getSource(); 
     if (select.getSubmittedValue() == null || 
       select.getSubmittedValue().toString().isEmpty()) { 
      return null; 
     } 
     else {   
      String id = select 
        .getSubmittedValue().toString(); 
       return ObjectThatImplementsConverterInterface.getAsObject(FacesContext.getCurrentInstance(), select, id); 
     } 
    } 
    return null; 
} 

Unfortunally你必須處理方式,因爲如果你不這樣做,用戶可以選擇「選了一家」和之後,mbean.value將爲OK(空),同一個SelectOneMenu中的第二個選擇將使用先前選定的值(空)進行觸發。我不知道這是否會發生在每個人或只有我。

再見。