MyFaces を使用して、ページ分割された並べ替え可能なデータテーブルを作成しようとしています。並べ替えは正常に機能します。列ヘッダーをクリックすると、列に基づいてデータが並べ替えられます。また、ページネーションはほとんどの場合うまく機能します。データテーブルは、ページごとにいくつかのアイテムで適切に分割されます。さらに、ユーザーがページごとに表示されるアイテムの数を変更できるようにしたいと考えています。繰り返しますが、これはすべてのアイテムを 1 ページに表示するまで機能しているようです。
このリファレンス(こちらも参照) によると、 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から「すべて」の項目を選択すると、上記の例外が発生します。うまくいけば、適切なレベルの詳細が含まれています。ありがとう!