我正在尝试使用 MyFaces 创建一个分页,可排序的数据表。分拣工作正常;我可以单击列标题,它将根据列对数据进行排序。此外,分页在大多数情况下都可以正常工作。数据表将每页适当地分割一些项目。此外,我希望用户能够更改每页显示的项目数。同样,这似乎一直有效,直到我想要在一个页面上显示所有项目。
根据此reference(也是here),如果将 t:datatable 的“rows”属性设置为“0”,它将显示剩余的行在表中。但是,当我尝试这个时,我得到一个包含此消息的异常:
javax.faces.FacesException - You need to set a value to the 'rows' attribute of component 'myComponent'
我正在尝试使用辅助bean中的属性设置每页的项目数。我的 t:datatable 如下所示:
<t:dataTable id="myComponent" var="cur"
value="#{backingBean.list}" sortAscending="#{backingBean.ascending}"
sortColumn="#{backingBean.sortColumn}" sortable="true"
styleClass="myClass" rowClasses="oddRow,evenRow"
rows="#{backingBean.itemsPerPage}" preserveDataModel="false">
<!-- data here -->
</t:datatable>
稍后,我有一个 t:dataScroller 来控制分页:
<t:dataScroller id="pageNavigation" for="myComponent"
paginatorActiveColumnStyle="font-weight:bold;"
renderFacetsIfSinglePage="false"
binding="#{backingBean.scroller}"
paginator="true" >
<!-- facets here -->
</t:dataScroller>
然后,我有一个 h:selectOneMenu 来选择每页的项目数
<h:selectOneMenu id="myScroller"
value="#{backingBean.itemsPerPage}"
required="true" onchange="this.form.submit();"
valueChangeListener="#{backingBean.updateItemsPerPage}">
<f:selectItems value="#{backingBean.itemsPerPageArray}" />
</h:selectOneMenu>
我的支持bean看起来像这样:
public class BackingBean {
private boolean ascending;
private Long itemsPerPage;
private String sortColumn;
private ArrayList<SelectItem> itemsPerPageArray;
private ArrayList<SomeObject> list; // data for table
private HtmlDataScroller scroller;
// constructors, getters, setters, and other stuff here
public void updateItemsPerPage(ValueChangeEvent valueChangeEvent) {
itemsPerPage = (Long) valueChangeEvent.getNewValue();
resetScrollerIndex();
}
private void resetScrollerIndex() {
if (scroller!=null && scroller.isPaginator())
scroller.getUIData().setFirst(0);
}
// called in constructor
private void constructItemsPerPageArray() {
itemsPerPageArray = new ArrayList<SelectItem>();
itemsPerPageArray.add(new SelectItem(new Long(10), "10"));
itemsPerPageArray.add(new SelectItem(new Long(50), "50"));
itemsPerPageArray.add(new SelectItem(new Long(100), "100"));
itemsPerPageArray.add(new SelectItem(new Long(0), "All"));
}
}
总而言之,当我从 h:selectOneMenu 中选择“全部”项目时,我得到上述异常。希望我已经包含了适当的细节。谢谢!
答案 0 :(得分:0)
好吧,我想我找到了答案......
如果我从updateItemsPerPage方法中删除第一行,问题就解决了。该方法现在看起来像:
public void updateItemsPerPage(ValueChangeEvent valueChangeEvent) {
resetScrollerIndex();
}
它以为我曾尝试过......