我有一个p:datatable,有多种选择模式和一个paginator。
<p:datatable value=#{rows} selection=#{selectedRows} pagintor="true" rows="20" rowsPerPageTemplate="10,20,50,100" paginatorPosition="bottom">
<p:column selectionMode="multiple"/>
<p:ajax event="toggleSelect"/>
... columns ...
</p:datatable>
当我点击标题复选框时,所有行都被选中。当我单击标题复选框以选择所有行,然后想要导出所选行(通过使用'selection'的值)时,它只返回20个对象。我希望当我使用标题复选框时,它会选择数据表的所有行,而不仅仅是页面中的一行。我有一个超过200页的数据表,所以你可以想象使用paginator导出所有这些是非常繁琐的工作;)。
我想这是我应该记录的错误,或者我错过了什么?我仔细查看了文档,但它没有说明将多个选择模式与分页一起使用...感谢您的反馈!
答案 0 :(得分:1)
我有完全相同的要求 - select all rows across pages
。
我做了什么 - 提供了<p:inputSwitch />
来切换所有页面上的所有行。
已复制,如下所示 -
<p:dataTable id="id" var="var" widgetVar="wvar" rowsPerPageTemplate="7,15" reflow="true"
value="#{backingBean.dataModel}" paginator="true" rows="7" rowIndexVar="index" rowKey="#{var.id}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
selection="#{backingBean.selectedItems}">
<c:facet name="header"...
<p:inputSwitch value="#{backingBean.allRecords}" onLabel="All" offLabel="None" >
<p:ajax onstart="if (PF('wvar').getSelectedRowsCount() == 0) PF('wvar').selectAllRows(); else PF('wvar').unselectAllRows();" />
</p:inputSwitch>
private boolean allRecords;//Getter++Setter++
并定义toggleSelect
事件如下 -
<p:ajax event="toggleSelect" onstart="if (PF('wvar').getSelectedRowsCount() == 7 || PF('wvar').getSelectedRowsCount() == 15) PF('wvar').selectAllRows(); else PF('wvar').unselectAllRows();" />
其中7
和15
来自数据表rowsPerPageTemplate="7,15"
。
适合我。(PrimeFaces 5.3)
答案 1 :(得分:0)
我希望当我使用标题复选框时,它会选择数据表的所有行,而不仅仅是页面中的一行。
这是一个错误的期望。
我想这是我应该记录的错误,
不。
或者我错过了什么?
不,这是设计上的。除了错误的期望之外你不会错过任何东西。如果你在PrimeFaces论坛中计算请求的数量,那么你是SO中第一个提出这个问题而第二个问题就是这个事实。
甚至GMail都没有这样做。他们为您提供了选择您所在页面上所有消息的选项,当您执行此操作时,他们会为您提供其他选项,以选择所有网页上的所有消息
答案 2 :(得分:0)
Sample Code:-
**JAVA (your backing bean class)
==============================**
//Stores the checked items from data table.
private List<String> selectedIds = new ArrayList<>();
private List<String> getSomeList() {
// return list of strings to data table
return someList;
}
public void selectAllCheckboxes(ToggleSelectEvent event) {
if (selectedIds != null) {
selectedIds.clear();
if (event.isSelected()) {
selectedIds.addAll(someList); //Add all the elements from getSomeList()
}
}
}
**XHTML
=====**
<p:dataTable id="data-table-id" value="#{backingBean.someList}"
selection="#{backingBean.selectedIds}" rowKey="#{id}" var="id"
paginator="true" rows="10" paginatorPosition="bottom"
paginatorAlwaysVisible="false" rowSelectMode="checkbox"
rowsPerPageTemplate="10,20,30,50">
<p:column selectionMode="multiple" />
<p:ajax event="toggleSelect"
update="@this"listener="#backingBean.selectAllCheckboxes}"/>
</p:dataTable>
答案 3 :(得分:-1)
对于JSF 2,对于选择的数据表中的所有行,选择模式多个paginator=true
:
在页面
<p:dataTable widgetVar="tableArea" yourtags...>
<p:ajax event="toggleSelect" oncomplete="teste()" /> /// toggleSelect is dispared on click to checkbox header
<p:column id="columnId" selectionMode="multiple"/>
在js:
function teste(){
var checked = $(document).find(":checkbox")["0"].checked; ///Find checkbox header and verify if checkbox is checked
if(checked == true){
PF('tableArea').selectAllRows(); // if true, selectAllRows from datatable
} else {
PF('tableArea').unselectAllRows(); //
}
}