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