【问题标题】:p:datatable filter: cannot validate component with empty valuep:数据表过滤器:无法验证具有空值的组件
【发布时间】:2016-09-29 14:31:31
【问题描述】:

有没有办法通过单击里面的文本并使该文本成为过滤器来过滤 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')。

【问题讨论】:

  • 有事件。如果您可以在过滤器字段中获得单击的文本,我猜您可以以 PF('datatablewv').filter() 结尾。不过我没试过

标签: primefaces apache-tomee tomee-7


【解决方案1】:

我可以通过将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="..."/>

另见:

【讨论】:

  • 差不多了 - 这会将文本放入过滤器字段但过滤不起作用:无法验证具有空值的组件:alltxform:tablealltx:myFilter.
  • 做了一些谷歌搜索。似乎这是由于没有value 的输入。可能这与 JSF 实现相关(我在 Mojarra 2.2.7 上)。我会更新答案(不管有没有value,它都对我有用)。
  • 你不能使用h:outputtext吗?这是一种输出标签的错误用法(滥用?)
  • 但是问题出在inputText上。 #{myBean.myFilter} 在您的答案中绑定到什么?
  • 您问题中的数据表没有将widgetVar 设置为tablealltx,因此PF('tablealltx').filter() 将失败。您可以通过在浏览器的 JavaScript 控制台中输入 PF('tablealltx') 来测试它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多