【问题标题】:How to use f:selectItem properly with JSF2?如何在 JSF2 中正确使用 f:selectItem?
【发布时间】:2013-04-24 22:11:24
【问题描述】:

当用户选择 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":true}

我该怎么办?

【问题讨论】:

    标签: ajax jsf-2


    【解决方案1】:

    对于那些有同样疑问的人。

    您需要将 immediate="true" 放入您的 ajax 请求中。

    <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(null),之后在同一个 SelectOneMenu 中的第二个选择将与前一个选择一起触发值(空)。我不知道这是发生在每个人身上还是只有我。

    再见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2012-08-30
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多