p:datatable 过滤器:无法验证具有空值的组件
p:datatable filter: cannot validate component with empty value
有没有一种方法可以通过单击里面的文本并将此文本设为过滤器来过滤 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 复制粘贴:
The data table in your question doesn't have a widgetVar set to
tablealltx, so PF('tablealltx').filter() will fail. You can test it by
entering PF('tablealltx') in your browser's JavaScript console.
我能够通过将 widgetVar="myTable"
设置为数据 table,使用自定义筛选字段,将单元格内容替换为 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="..."/>
另请参阅:
- Custom HTML tag attributes are not rendered by JSF
有没有一种方法可以通过单击里面的文本并将此文本设为过滤器来过滤 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 复制粘贴:
The data table in your question doesn't have a widgetVar set to tablealltx, so PF('tablealltx').filter() will fail. You can test it by entering PF('tablealltx') in your browser's JavaScript console.
我能够通过将 widgetVar="myTable"
设置为数据 table,使用自定义筛选字段,将单元格内容替换为 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="..."/>
另请参阅:
- Custom HTML tag attributes are not rendered by JSF