自定义 facelet <p:colum> 未正确过滤
Custom facelet <p:colum> does not filter properly
我对 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 的建议,我已经设法使用 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>
虽然它被记录为一种可选的,但在我们的例子中,我们必须添加 field
属性。我认为这是因为无法在过滤器请求中解析自定义标记属性。所以使用:
<p:column filterable="true" field="#{property}" ... />
对于其他用途,我们使用以下方法将自定义标签属性添加到组件:
<f:attribute name="myAttr" value="#{myAttr}" />
您稍后可以通过以下方式阅读:
#{component.attributes.myAttr}
或:
#{component.parent.attributes.myAttr}
取决于组件。
我对 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"/>
通过遵循
我创建了一个小 git 项目 here 来显示所有代码,如果需要的话 运行 它。它将显示以下页面。前 3 个布尔列是明确的
有人遇到过这种问题并且能够解决吗?
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>
虽然它被记录为一种可选的,但在我们的例子中,我们必须添加 field
属性。我认为这是因为无法在过滤器请求中解析自定义标记属性。所以使用:
<p:column filterable="true" field="#{property}" ... />
对于其他用途,我们使用以下方法将自定义标签属性添加到组件:
<f:attribute name="myAttr" value="#{myAttr}" />
您稍后可以通过以下方式阅读:
#{component.attributes.myAttr}
或:
#{component.parent.attributes.myAttr}
取决于组件。