取消选择行时刷新 p:datatable 的选择模型
Refresh selection model of p:datatable on row deselection
我对 Primefaces 5.0 数据表的 selection 模型有疑问。此 selection 模型无法正确处理 deselection:
行的选择将这些角色按预期添加到 selected 行的列表中。但是 deselection 对这个列表没有影响; deselected 行保留在其中。仅删除select所有行会生成一个空列表。
下面给出datatable的定义(缩减为相关标签)-数据模型类型为org.primefaces.model.LazyDataModel:
<p:dataTable id="cases"
widgetVar="cases"
var="cases"
value="#{casesController.dataModel}"
selection="#{casesController.selectedCases}"
selectionMode="multiple"
/>
该项目中使用了一个 Javascript 函数,该函数将对行的点击处理为 select 并取消 select 行。
onRowClick : function(event, rowElement, silent) {
// Check if rowclick triggered this event not a clickable
// element in row content
if ($(event.target).is('td,span:not(.ui-c)')) {
var row = $(rowElement),
selected = row.hasClass('ui-state-highlight'),
metaKey = event.metaKey || event.ctrlKey,
shiftKey = event.shiftKey;
mouseBtn = event.which;
// unselect if already selected on leftClick/touch to enable
// contextMenu to be shown on rightclick
if (selected && mouseBtn == 1) {
this.originRowIndex = row.index();
this.cursorIndex = null;
this.unselectRow(row, silent);
} else {
// unselect previous selection if this is single
// selection or multiple one with no keys
if (this.isSingleSelection()
|| (this.isMultipleSelection() && event
&& !metaKey && !shiftKey && this.cfg.rowSelectMode === 'new')) {
this.unselectAllRows();
}
// range selection with shift key
if (this.isMultipleSelection() && event && event.shiftKey) {
this.selectRowsInRange(row);
}
// select current row
else {
this.originRowIndex = row.index();
this.cursorIndex = null;
this.selectRow(row, silent);
}
}
PrimeFaces.clearSelection();
}
}
调试此脚本表明分支已按预期通过。但在我看来,unSelectRow() 并不是 selectRow() 的对立面。
在 javascript 函数周围添加注释以使用原始 Primefaces 函数对我的问题没有影响。
我终于找到了解决办法。他们扩展了 PrimeFaces 的实现并且不完整地实现了一些方法。以下线程帮助我解决了问题:p:dataTable selections are lost after paginating a LazyDataModel
我对 Primefaces 5.0 数据表的 selection 模型有疑问。此 selection 模型无法正确处理 deselection: 行的选择将这些角色按预期添加到 selected 行的列表中。但是 deselection 对这个列表没有影响; deselected 行保留在其中。仅删除select所有行会生成一个空列表。
下面给出datatable的定义(缩减为相关标签)-数据模型类型为org.primefaces.model.LazyDataModel:
<p:dataTable id="cases"
widgetVar="cases"
var="cases"
value="#{casesController.dataModel}"
selection="#{casesController.selectedCases}"
selectionMode="multiple"
/>
该项目中使用了一个 Javascript 函数,该函数将对行的点击处理为 select 并取消 select 行。
onRowClick : function(event, rowElement, silent) {
// Check if rowclick triggered this event not a clickable
// element in row content
if ($(event.target).is('td,span:not(.ui-c)')) {
var row = $(rowElement),
selected = row.hasClass('ui-state-highlight'),
metaKey = event.metaKey || event.ctrlKey,
shiftKey = event.shiftKey;
mouseBtn = event.which;
// unselect if already selected on leftClick/touch to enable
// contextMenu to be shown on rightclick
if (selected && mouseBtn == 1) {
this.originRowIndex = row.index();
this.cursorIndex = null;
this.unselectRow(row, silent);
} else {
// unselect previous selection if this is single
// selection or multiple one with no keys
if (this.isSingleSelection()
|| (this.isMultipleSelection() && event
&& !metaKey && !shiftKey && this.cfg.rowSelectMode === 'new')) {
this.unselectAllRows();
}
// range selection with shift key
if (this.isMultipleSelection() && event && event.shiftKey) {
this.selectRowsInRange(row);
}
// select current row
else {
this.originRowIndex = row.index();
this.cursorIndex = null;
this.selectRow(row, silent);
}
}
PrimeFaces.clearSelection();
}
}
调试此脚本表明分支已按预期通过。但在我看来,unSelectRow() 并不是 selectRow() 的对立面。
在 javascript 函数周围添加注释以使用原始 Primefaces 函数对我的问题没有影响。
我终于找到了解决办法。他们扩展了 PrimeFaces 的实现并且不完整地实现了一些方法。以下线程帮助我解决了问题:p:dataTable selections are lost after paginating a LazyDataModel