次のように、JSF Web アプリケーションにフィルタリング機能を実装したいと考えています。ユーザーは、必要な数のフィルターを追加できます。それらを削除することもできます。だから私はフィルターのdataTableを持っています。各行は、同じ行で 2 番目の h:selectOneMenu を表示するために ajax の「変更」イベントを持つ 1 つの h:selectOneMenu で構成されます。2 番目の h:selectOneMenu のオプションは、最初の選択されたオプションに従って動的に計算されます。
問題は、ajax イベントを追加しても、2 番目の h:selectOneMenu の値がバックエンド オブジェクトに設定されないことです。ただし、最初の h:selectOneMenu の値は設定されています。
.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>
ViewScoped を持つ「FilterManager」という Bean があります。重要な部分を以下に示します。
@ManagedBean
@ViewScoped
public class FilterManager implements Serializable {
private List<Filter> filters; // it has a getter
private int currentFilterId;
public void addNewFilter(AjaxBehaviorEvent event) {
this.currentFilterId++;
this.filters.add(Filter.getEmptyFilter(this.currentFilterId));
}
public void removeFilter(Filter filter) {
this.filters.remove(filter);
}
...
}
Filter クラスは通常のクラス (Bean ではない) であり、以下に示されています。
public class Filter implements Serializable {
private int id;
private String filter;
private String value;
public String getFilter() {
return filter;
}
public void setFilter(String theFilter) {
if (theFilter != null && !theFilter.isEmpty())
this.filter = theFilter;
}
public String getValue() {
return value;
}
public void setValue(String theValue) {
this.value = theValue;
}
public boolean isFilterEmpty() {
return this.filter == null || this.filter.isEmpty();
}
...
}
TypeSelector は、getter および setter とともに typeSelected プロパティを持つ SessionScoped Bean であることに注意してください。
問題は、filter.filter が正しく設定されているのに、filter.value が設定されていないことです。問題が見つからないので、助けてください。このすべてのコードについてお詫び申し上げますが、必要な詳細をすべて提供する必要がありました。
前もって感謝します!