我在按照自己认为的方式工作时遇到了问题。我有一个dataTable,我从一个福利对象列表构建。这些对象中的每一个都可以只有一种类型:组,帐户或父级。我想在选择单选按钮时刷新列表。页面加载时,将显示组对象并预先选择组单选按钮。如果用户单击帐户单选按钮,我使用Ajax刷新列表,这次显示Account对象。以下是精简代码: XHTML:
<!-- Radio button to subset records -->
<h:selectOneRadio
id="varButtons"
value="#{benefitUI.buttonValue}"
styleClass="radio">
<f:selectItem
itemLabel="Group"
itemValue="G" />
<f:selectItem
itemLabel="Account"
itemValue="A" />
<f:selectItem
itemLabel="Parent"
itemValue="P" />
<p:ajax event="click" update="benList" process="@this" />
</h:selectOneRadio>
<p:dataTable
id="benList"
var="ben"
value="#{benefitUI.filteredBenefitList}"
rowIndexVar="vbRowIndex"
rowClasses="panel-grid-row-odd, panel-grid-row-even"
styleClass="mimic-datatable"
<p:column headerText="From" style="text-align:center;">
<h:outputText value="#{ben.beginDate}"/>
</p:column>
<p:column headerText="To" style="text-align:center;">
<h:outputText value="#{ben.endDate}"/>
</p:column>
</p:dataTable>
BenefitUI的Java:
@PostConstruct
public void init() {
/* Code that creates my unfiltered list removed for brevity. */
/** benefitList is the name of the unfiltered list **/
// Pre-select group on page load
setButtonValue("G");
}
public List<Benefit> getFilteredBenefitList() {
String filter = getButtonValue();
List<Benefit> filteredList = new ArrayList<Benefit>();
for (Benefit vb : benefitList) {
// The below code is working just fine, when filter is not blank
if ((filter.equals("G") & vb.getGroup() != null)
|| (filter.equals("A") & vb.getAccount() != null)
|| (filter.equals("P") & vb.getParent() != null)) {
filteredList.add(vb);
}
}
return filteredList;
}
public void setButtonValue(String bValue) {
this.buttonValue = bValue;
}
public String getButtonValue() {
return this.buttonValue();
}
页面加载得很好,显示了组的好处。但是当我单击“帐户”按钮时,会将空字符串传递给setButtonValue方法,因此在构建筛选列表时,不会包含任何记录,并且页面会显示一个空列表。我怎么做错了itemValue没有被发送到setButtonValue?其次,为什么setButtonValue和getFilteredBenefitList方法都被调用了四次?
我确定在Ajax行或selectItem上有关键字或遗漏的内容,但我不知道它可能是什么。