Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 如何在JSF2中正确使用f:selectItem?_Ajax_Jsf 2 - Fatal编程技术网

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

Ajax 如何在JSF2中正确使用f:selectItem?,ajax,jsf-2,Ajax,Jsf 2,伙计们,当用户选择combo_pedido_tipoplm selectOneMenu的一个选项时,我需要更新另一个selectOneMenu。如果用户选择“选择一个”选项,则需要清除第二个选项 我已经尝试了所有方法,但是在我从h:SelectOne菜单中选择了选项“SelectOne”(SelectOne)之后,我无法调用actionListener XHTML 姆宾 私人蒂波普拉卡梅蒂波普拉卡梅菲特罗; 公共空间popularTipoPlacaMae(){ this.selectItem

伙计们,当用户选择combo_pedido_tipoplm selectOneMenu的一个选项时,我需要更新另一个selectOneMenu。如果用户选择“选择一个”选项,则需要清除第二个选项

我已经尝试了所有方法,但是在我从h:SelectOne菜单中选择了选项“SelectOne”(SelectOne)之后,我无法调用actionListener

XHTML


姆宾

私人蒂波普拉卡梅蒂波普拉卡梅菲特罗;
公共空间popularTipoPlacaMae(){
this.selectItemsTipoPlacaMae=newArrayList();
对于(TipoPlacaMae tipoplaca:TipoPlacaMae.values()){
this.selectitemstipoplacame.add(新的SelectItem(tipoplaca,tipoplaca.getNome());
}
UtilsCommon.orderByLabel(selectItemsTipoplacame);
}
公共无效TipoplacameChange(AjaxBehaviorEvent e){
//这是一个非常美丽的地方。
长柄山猫(空);
limparDadosPedido();
popularPlacaMae();
}
如果我选择选项“Selected one”,我会得到一个验证错误,因为这个SelectOne菜单会被重新查询,并且我的tipoPlacaMaeFiltro设置程序不会被调用

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

{“validationFailed”:true}


对此我能做些什么?

对于那些有同样疑问的人

您需要在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>
不幸的是,您必须以这种方式处理,因为如果您不这样做,用户可以选择“selected One”,并且mbean.value将是OK(null),之后,同一SelectOne菜单中的第二个选择将使用以前选择的值(null)触发。我不知道这是发生在每个人身上还是只发生在我身上


再见。

对于那些有同样疑问的人

您需要在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>
不幸的是,您必须以这种方式处理,因为如果您不这样做,用户可以选择“selected One”,并且mbean.value将是OK(null),之后,同一SelectOne菜单中的第二个选择将使用以前选择的值(null)触发。我不知道这是发生在每个人身上还是只发生在我身上

再见

<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>
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;
}