有没有办法通过点击里面的文本并将此文本作为过滤器来过滤p:datatable列?
换句话说,如果我点击会话ID,我希望数据表按点击的ID过滤此列,就像我在上面的过滤器中手动输入一样?
我正在使用Primefaces 6
更新
这是我完整的数据表,其中包含建议的解决方案:
<p:dataTable id="tablealltx" var="transaction" value="#{pastTxModel.txList}" paginator="true" rows="20" sortBy="#{transaction.createdDate}" sortOrder="descending" resizableColumns="true">
<p:column filterBy="#{transaction.session}" filterMatchMode="contains">
<f:facet name="filter">
<p:inputText id="myFilter" value="#{transactionXmlController.currentFilter}" onchange="PF('alltxform').filter()" />
</f:facet>
<p:outputLabel value="#{transaction.session}" ondblclick="document.getElementById('alltxform:tablealltx:myFilter').value = this.innerText;PF('tablealltx').filter()" >
</p:column>
</p:dataTable>
当我双击会话时,会在过滤器文本框中输入值,但过滤本身不起作用。什么都没发生。
我正在使用TomEE 7.0.1
解决方案 从Jasper复制粘贴:
您问题中的数据表没有设置为widgetVar tablealltx,所以PF('tablealltx')。filter()将失败。你可以测试一下 在浏览器的JavaScript控制台中输入PF('tablealltx')。
答案 0 :(得分:2)
我可以通过将widgetVar="myTable"
设置为数据表,使用自定义过滤器字段,将单元格内容替换为p:outputLabel
(具有ondblclick
)和JavaScript来实现此目的一起:
<p:column headerText="Session" filterBy="#{transaction.session}" ...>
<f:facet name="filter">
<p:inputText id="myFilter"
value="#{myBean.myFilter}"
onchange="PF('myTable').filter()"/>
</f:facet>
<p:outputLabel value="#{transaction.session}"
ondblclick="document.getElementById('myForm:myTable:myFilter').value = this.innerText;PF('myTable').filter()"/>
</p:column>
为了更好的可读性,这里是ondblclick
:
var filterId = 'myForm:myTable:myFilter';
document.getElementById(filterId).value = this.innerText;
PF('myTable').filter();
您可以使用简单的p:outputLabel
替换h:outputText
,但在这种情况下(假设您使用的是JSF 2.2+),您需要添加名称空间xmlns:a="http://xmlns.jcp.org/jsf/passthrough"
。现在你可以使用:
<h:outputText value="#{transaction.session}"
a:ondblclick="..."/>
另见: