即使在使用f:ajax时,也不会设置JSF h:selectOneMenu

即使在使用f:ajax时,也不会设置JSF h:selectOneMenu,jsf,binding,Jsf,Binding,我想在JSFWeb应用程序中实现一个过滤功能,如下所示:用户可以添加任意数量的过滤器。他们也可以删除它们。所以我有一个过滤器的数据表。每一行由一个h:selectOneMenu组成,其中包含一个ajax“更改”事件,以便在同一行中显示第二个h:selectOneMenu。第二个h:SelectOne菜单的选项根据第一个菜单的所选选项动态计算 问题是,即使我添加了ajax事件,第二个h:selectOneMenu的值也从未设置为后端对象。但是,设置了第一个h:SelectOne菜单的值 我在.xh

我想在JSFWeb应用程序中实现一个过滤功能,如下所示:用户可以添加任意数量的过滤器。他们也可以删除它们。所以我有一个过滤器的数据表。每一行由一个h:selectOneMenu组成,其中包含一个ajax“更改”事件,以便在同一行中显示第二个h:selectOneMenu。第二个h:SelectOne菜单的选项根据第一个菜单的所选选项动态计算

问题是,即使我添加了ajax事件,第二个h:selectOneMenu的值也从未设置为后端对象。但是,设置了第一个h:SelectOne菜单的值

我在.xhtml页面中有以下代码片段:

<h:form id="filterForm">
    <h:dataTable id="filterTable" value="#{filterManager.filters}" var="filter">
        <h:column>
            <h:outputLabel value="#{msgs.filterBy}:" for="availableFilters" />
            <h:selectOneMenu id="availableFilters" value="#{filter.filter}">
                <f:selectItems value="#{filterManager.getProperties(typeSelector.typeSelected)}" />
                <f:ajax event="change" render=":filterForm" />
            </h:selectOneMenu>
        </h:column>

        <h:column>
            <h:panelGroup id="filterValuesPanel" >
                <h:outputLabel value="#{msgs.value}:" for="filterValues" rendered="#{!filter.filterEmpty}" />
                <h:selectOneMenu value="#{filter.value}" id="filterValues" rendered="#{!filter.filterEmpty}" >
                    <f:selectItems value="#{filterManager.getPossibleAnswers(filter)}" />
                    <f:ajax event="change" render=":filterForm" />
                </h:selectOneMenu>
            </h:panelGroup>
        </h:column>

        <h:column>
            <h:commandButton value="#{msgs.delete}" title="#{msgs.deleteFilter}">
                <f:ajax event="click" listener="#{filterManager.removeFilter(filter)}" render=":filterForm" />
            </h:commandButton>
        </h:column>

    </h:dataTable>

    <h:commandButton value="#{msgs.addNewFilter}">
        <f:ajax event="click" listener="#{filterManager.addNewFilter}" render=":filterForm" />
    </h:commandButton>
</h:form>
请注意,TypeSelector是一个SessionScoped bean,它具有typeSelected属性以及getter和setter

问题是:filter.filter设置正确,而filter.value从未设置。我找不到问题,所以我需要你的帮助。对所有这些代码表示歉意,但我需要向您提供所有必要的详细信息


提前谢谢

好了,伙计们,那是我的错。我在FilterManager.getPossibleAnswers(Filter Filter)方法中有一个bug。基本上,在方法的末尾,我将filter.value设置为List的第一个元素。代替写作

if (filter.getValue() == null || filter.getValue().isEmpty()) {
    SelectItem first = answers.get(0);
    filter.setValue((String) first.getValue());
} 
我刚刚写道:

    SelectItem first = answers.get(0);
    filter.setValue((String) first.getValue());

尽管filter.value正在正常更新,但在重新呈现dataTable组件期间,该值正在更改回默认值(列表中的第一个元素)。

请编辑您的问题。。没有人会看到这个龙格问题伙计@谢谢你的建议。我删除了一些代码。我的想法是,既然我不知道问题出在哪里,我就把我认为与问题相关的部分代码放进去。@NGH现在好点了吗?
if (filter.getValue() == null || filter.getValue().isEmpty()) {
    SelectItem first = answers.get(0);
    filter.setValue((String) first.getValue());
} 
    SelectItem first = answers.get(0);
    filter.setValue((String) first.getValue());