我正在使用Primefaces 3.5数据表。该表启用了多选择模式。基本上,这个表与[本展示][1]中的最后一个表相同。表是这样定义的
<p:dataTable id="myTable" var="item" value="#{myController.items}" selection="#{myController.selectedItems}" rowKey="#{item.id}">
<p:column selectionMode="multiple"/>
<p:column headerText="Id">
...
因此,当用户通过单击复选框选择了一些行,然后意外地单击了一行时,除了用户最后单击的行外,所有选中的行都变为未选中的。
问题是:是否有任何解决方案来维持行选择,即使用户将单击行出复选框?
我的一些观察:
- 如果用户按Ctrl并单击该行,则所有其他行将保持选中。这种行为正是我想要的,但没有按Ctrl。
- 我已经查看了
primefaces.js
源,发现其他行被这个函数clearSelection:function(){}
取消选择。当用户点击行时,不执行它是可以的。
如果您阅读了最新的文档,您可以看到在较新的版本中支持它。因此,要在3.5版本中修复这个问题,请查看更新版本的源代码,了解他们是如何"修复"这个问题的,并创建一个js补丁……当然,你也可以尝试使用更新的PF版本。后者有很多好处。
不在这里发布(甚至试图创建)补丁(或试图创建一个)的原因是,在这里发布补丁太复杂了,而且超出了SO从问题(OP添加在那里作为'答案')复制:
正如Kukeltje所建议的,我已经创建了primefaces.js
补丁,修改了DataTable
小部件。为此,我从jar文件中复制了primefaces.js
,进行了修改并将其放在以下目录下:
webapp
|-- META-INF
|-- WEB-INF
|-- resources
| |-- primefaces
| | `-- primefaces.js
我在primefaces.js
中所做的修改只是从onRowClick: function(e, d, a)
函数中删除this.unselectAllRows()
。