号码:数据表selectAllRows API调用不会触发rowSelect事件

问题描述:

我有一个p:dataTableselectionMode=multiple结合的rowSelectrowUnselect事件:号码:数据表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.selectionmyBean.onSelect()都不是。我必须这样做才能实现这个目标?

+0

我没有真正的想法,但是我应该去调试一些东西来找出更多的东西,但是出于好奇,你**调试了什么? Ajax调用?网络流量?检查PrimeFaces源代码(包括js和java文件)。很多你可以做的事 – Kukeltje

+0

我检查过,调用'selectAllRows()'时没有Ajax-Call或网络流量。我也尝试在调用'selectAllRows()'之前或之后调用'PF('myDatatable')。fireRowSelectEvent()',但是我找不到正确的参数。 – Bob

+0

如果你使用了'commandButton',例如从页面触发一个调用(使用selectAllRows函数后)。例如。就像在'Multiple with Meta and Shift keys'的展示中一样' – Kukeltje

这两个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(或合并两个单独的呼叫一个自定义功能)。