簡體   English   中英

如何在JSF2中正確使用f:selectItem?

[英]How to use f:selectItem properly with JSF2?

伙計們,當用戶選擇combo_pedido_tipoplm selectOneMenu的一個選項時,我需要更新另一個selectOneMenu。 如果用戶選擇“選擇一個”選項,則需要清除第二個選項。

我已經嘗試了所有方法,但是從h:selectOneMenu中選擇了“選擇一個”(Selecione)選項后,無法調用actionListener。

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”:真正}

我該怎么辦?

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

您需要在ajax請求中放入“ instant =“ 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;
}

不幸的是,您必須以這種方式處理,因為如果不這樣做,用戶可以選擇“選擇一個”,並且mbean.value將為OK(空),之后,同一SelectOneMenu中的第二個選擇將以先前選擇的值觸發(空)。 我不知道這是發生在所有人身上還是我身上。

再見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM