【问题标题】:Primefaces: multiple datatables on page - sortingPrimefaces:页面上的多个数据表 - 排序
【发布时间】:2015-10-20 19:36:02
【问题描述】:

我正在使用 Primefaces 5.2。

在我的页面上,我有几个 p:datatables 具有相同的列和相同的 sortBy 表达式。

类似:

<p:dataTable .. id="tab1">
   <p:column sortBy="#{prop1}">
      #{prop1}
   </p:column>
</p:dataTable>


<p:dataTable .. id="tab2">
   <p:column sortBy="#{prop1}">
      #{prop1}
   </p:column>
</p:dataTable>

到目前为止,排序工作正常,但如果我对其中一个表(我们称之为表 A)进行排序,然后刷新页面(例如,通过触发 h:commandButton),我会得到奇怪的行为,最后会出现 NullPointerException。在这种情况下,所有表都突出显示与表 A 相同的列。此外,一旦我对表 A 以外的表进行排序,就会发生以下异常:

21:33:36,149 严重 javax.enterprise.resource.webcontainer.jsf.application(默认任务 25)错误渲染视图 [/stocks.xhtml]:java.lang.NullPointerException 在 org.primefaces.component.datatable.DataTable.findColumnInGroup(DataTable.java:905) [primefaces-5.2.jar:5.2] 在 org.primefaces.component.datatable.DataTable.findColumn(DataTable.java:896) [primefaces-5.2.jar:5.2] 在 org.primefaces.component.datatable.DataTable.getSortColumn(DataTable.java:1401) [primefaces-5.2.jar:5.2] 在 org.primefaces.component.datatable.feature.SortFeature.singleSort(SortFeature.java:136) [primefaces-5.2.jar:5.2] 在 org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:109) [primefaces-5.2.jar:5.2] 在 org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:83) [primefaces-5.2.jar:5.2] 在 javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:104) [jsf-impl-2.2.8-jbossorg-1.jar:] 在 com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:621) [jsf-impl-2.2.8-jbossorg-1.jar:] 在 com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:1110) [jsf-impl-2.2.8-jbossorg-1.jar:] 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 javax.faces.render.Renderer.encodeChildren(Renderer.java:176) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] 在 com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456) [jsf-impl-2.2.8-jbossorg-1.jar:

【问题讨论】:

  • 这是 ajax 还是非 ajax 刷新?通常我猜你也会有例如 var="item" 和 sortBy="#{item.prop1}"
  • 这是一个非 ajax 刷新。是的,我喜欢 var="item" 和 sortBy="#{item.prop1}"。以上只是一个缩写。

标签: sorting jsf-2 primefaces datatable


【解决方案1】:

解决方案是将 rowStatePreserved="true" 添加到包含其他表的表中。这是在 Primefaces 5.1.14 中添加的,是 JSF 2.1 的一部分。

致谢:sdjavaudvk (http://forum.primefaces.org/viewtopic.php?f=3&t=43441)。

<p:dataTable id="tab1" var="resumo" value="#{resumoView.resumos}" rows="20" 
                         paginator="true" 
                         rowsPerPageTemplate="5,10,15,20" 
                         rowStatePreserved="true">
...

【讨论】:

  • 如果数据表在迭代器中,这确实是一个鲜为人知的“技巧”来解决一些问题。 PrimeFaces 5.3.something 和 6.0 实现了一些额外的东西来防止迭代器中的问题
【解决方案2】:

您是否尝试过为每个数据表使用不同的表单?像这样:

<h:form>
  <p:dataTable id="tab1"> ... </p:dataTable>
</h:form>
  
<h:form>
  <p:dataTable id="tab2"> ... </p:dataTable>
</h:form>

【讨论】:

    【解决方案3】:

    我们在 Primefaces6.0 上遇到了同样的问题。

    我们有一个包含两个表的表单,并且可以通过值列表(filterMatchMode 精确)或输入文本(filterMatchMode 包含)过滤特定列。 第一个表没有有效的过滤器(我们遇到了与您相同的 NullPointerException),第二个工作正常。

    这两个表在一个组件中,两个表中过滤和排序的列是使用 JSTL 条件构建的,如下所示:

        <c:choose>
            <c:when test="#{cc.attrs.filterOperatorExact}">
                <p:column headerText="Header name"
                    sortBy="#{vector.operatorForDisplay}"
                    filterBy="#{vector.operatorForDisplay}" filterMatchMode="exact"
                    filterOptions="#{cc.attrs.filtersOperatorList}">
                    <h:outputText value="#{vector.operatorForDisplay}" />
                </p:column>
            </c:when>
            <c:otherwise>
                <p:column headerText="Header name"
                    sortBy="#{vector.operatorForDisplay}"
                    filterBy="#{vector.operatorForDisplay}" filterMatchMode="contains">
                    <h:outputText value="#{vector.operatorForDisplay}" />
                </p:column>
            </c:otherwise>
        </c:choose>

    使用“JSF方式”对渲染属性进行此操作,问题就消失了:

        <p:column headerText="Header name"
            sortBy="#{vector.operatorForDisplay}"
            filterBy="#{vector.operatorForDisplay}" filterMatchMode="exact"
            filterOptions="#{cc.attrs.filtersOperatorList}"
            rendered="#{cc.attrs.filterOperatorExact}">
            <h:outputText value="#{vector.operatorForDisplay}"/>
        </p:column>
        <p:column headerText="Header name"
            sortBy="#{vector.operatorForDisplay}"
            filterBy="#{vector.operatorForDisplay}" filterMatchMode="contains"
            rendered="#{not cc.attrs.filterOperatorExact}">
            <h:outputText value="#{vector.operatorForDisplay}"/>
        </p:column>

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 2018-04-11
      • 2013-05-07
      • 2013-02-18
      • 2013-02-16
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      相关资源
      最近更新 更多