号码:数据表selectAllRows API调用不会触发rowSelect事件
我有一个p:dataTable
与selectionMode=multiple
结合的rowSelect
和rowUnselect
事件:号码:数据表selectAllRows API调用不会触发rowSelect事件
<p:dataTable
widgetVar="myDatatable"
selectionMode="multiple"
selection="#{myBean.selection}">
<p:ajax event="rowSelect" listener="#{myBean.onSelect}" />
<p:ajax event="rowUnselect" listener="#{myBean.onUnselect}" />
... (columns)
</p:dataTable>
选择行工作正常,myBean.selection
更新并调用myBean.onSelect()
。
现在我想添加按钮(un)将所有项目选择到我的工具栏。我创建了两个<p:commandLink>
S:
<p:commandLink onclick="PF('myDatatable').selectAllRows();"
update="actionbarForm">select all</p:commandLink>
<p:commandLink onclick="PF('myDatatable').unselectAllRows();"
update="actionbarForm">unselect all</p:commandLink>
的选择似乎工作,我可以看到无论是所有项目(UN)选择了。但是,更新/调用myBean.selection
和myBean.onSelect()
都不是。我必须这样做才能实现这个目标?
这两个PrimeFaces javascript api调用不会与任何ajax事件进行交互。这可以在selectAllRows()
和unselectAllRows()
的datatable.js中看到。如果您不使用ajax,而是通过按钮进行常规“提交”,您会看到PrimeFaces将选择扩展到服务器端的“全部”。为此,它将选择的@all
值传递给服务器。
您还可以看到来源,已经有一些代码发送“toggleSelect`AJAX事件,所以我把它的功能扩展的PrimeFaces数据表:
PrimeFaces.widget.DataTable.prototype.fireToggleSelectEvent = function(checked) {
//fire toggleSelect event
if(this.cfg.behaviors) {
var toggleSelectBehavior = this.cfg.behaviors['toggleSelect'];
if(toggleSelectBehavior) {
var ext = {
params: [{name: this.id + '_checked', value: checked}
]
};
toggleSelectBehavior.call(this, ext);
}
}
}
调用后( un)selectAllRows()通过小部件,您可以调用此函数,也可以使用true(select)或false(unselect)值作为参数。
如果再加入toggleSelect AJAX到你的数据表
<p:ajax event="toggleSelect" listener="#{dtSelectionView.onToggleSelect}" update=":form:msgs" />
,并在bean添加一个处理程序:
public void onToggleSelect(ToggleSelectEvent event) {
FacesMessage msg = new FacesMessage(event.isSelected() ? "All Selected" : "All Unselected");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
它所有的作品。在PrimeFaces datatable.js和结束(PrimeFaces 6.0,对代码进行测试展示)
你也可以同时覆盖(UN)selectAllRows致电fireToggleSelectEvent,因此所有在一个functioncall(或合并两个单独的呼叫一个自定义功能)。
我没有真正的想法,但是我应该去调试一些东西来找出更多的东西,但是出于好奇,你**调试了什么? Ajax调用?网络流量?检查PrimeFaces源代码(包括js和java文件)。很多你可以做的事 – Kukeltje
我检查过,调用'selectAllRows()'时没有Ajax-Call或网络流量。我也尝试在调用'selectAllRows()'之前或之后调用'PF('myDatatable')。fireRowSelectEvent()',但是我找不到正确的参数。 – Bob
如果你使用了'commandButton',例如从页面触发一个调用(使用selectAllRows函数后)。例如。就像在'Multiple with Meta and Shift keys'的展示中一样' – Kukeltje