【问题标题】:Custom facelet <p:colum> does not filter properly自定义 facelet <p:column> 无法正确过滤
【发布时间】:2021-06-19 00:17:53
【问题描述】:

primeface 数据表中的列标记有问题。我有一个包含很多类似字段的模型,所以为了减少代码,我试图有一个定制的标签来填充每​​一列。 所以宁愿写类似的东西

<p:column headerText="MyHeader" filterBy="#{d.two}" styleClass="ps-footprint-type ps-vertical-title" >
    <f:facet name="filter">
        <p:triStateCheckbox onchange="PF('w_footprintsTable').filter()" converter="triStateBooleanConverter" />
    </f:facet>
    <h:panelGroup rendered="#{d.two}">  <i class="pi pi-check">v</i> </h:panelGroup>
</p:column> 

我正在尝试类似的东西

 <sjsf:booleanColumn value="#{d.two}" header="MyHeader" tableWidget="w_footprintsTable"/>

按照@Jasper 在following thread 中的建议,我已经设法使用facelet 标签完成了大部分工作。唯一的问题是过滤。它适用于显式列,但仅在使用我的 facelet 标记时适用于最后一列。

我创建了一个小 git 项目here 来显示所有代码并在需要时运行它。它将显示以下页面。前 3 个布尔列是显式 标记(过滤适用于所有三个),接下来的 3 个布尔列使用我的 facelet 标记,如您所见,列“四”没有正确过滤,但列“六"会。

有人遇到过这种问题并解决了吗?

PS:这是我自定义标签的代码

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui"
    xmlns:cc="http://java.sun.com/jsf/composite">

    <p:column headerText="#{header}" filterBy="#{value}" styleClass="sj-vertical-title" >
        <f:facet name="filter">
            <p:triStateCheckbox onchange="PF('#{tableWidget}').filter()" converter="triStateBooleanConverter" />
        </f:facet>
        <h:panelGroup rendered="#{value}">
            <i class="pi pi-check">V</i>
        </h:panelGroup>
    </p:column>

</ui:composition>

【问题讨论】:

    标签: jsf primefaces el primefaces-datatable


    【解决方案1】:

    虽然它被记录为一种可选的,但在我们的例子中,我们必须添加field 属性。我认为这是因为无法在过滤器请求中解析自定义标签属性。所以使用:

    <p:column filterable="true" field="#{property}" ... />
    

    对于其他用途,我们使用以下方式向组件添加自定义标签属性:

    <f:attribute name="myAttr" value="#{myAttr}" />
    

    您以后可以通过以下方式阅读:

    #{component.attributes.myAttr}
    

    或:

    #{component.parent.attributes.myAttr}
    

    取决于组件。

    【讨论】:

    • 谢谢,但不幸的是不是这样。我按照您的建议修改了我的标签,但它仍然只适用于最后一列。我什至交换了列以确保它仍然只适用于最后一个。
    • 我认为它是最小的,但你说得对,数据表上有太多额外的东西。我已经删除了大部分开销,但它仍然失败......
    • 我尝试过使用 LazyDataModel,当单击过滤器框后调用加载方法时,filterBy 映射仅包含 4 个条目(使用显式 p:column 的 3 个和taglib 的最后一个)。所以我错过了 2。看起来所有的 taglib 都有相同的键,所以最后一个会覆盖前两个。
    • 是的,字段属性起到了作用(在任何示例中从未真正注意到它)!非常感谢!
    猜你喜欢
    • 2021-05-21
    • 2018-11-18
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多