2015-10-20 33 views
0

我正在使用Primefaces 5.2。Primefaces:页面上的多个数据表 - 排序

在我的页面上,我有几个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> 

排序工作正常,到目前为止,但我得到了奇怪的行为,最后一个NullPointerException如果我排序表(我们称之为表A),然后刷新页面之一(例如通过发射啊:commandButton)。在这种情况下,所有的表都具有相同的列突出显示为表A.此外,只要我以后比排序表A以外的表,会出现以下异常:

21:33:36149严重javax.enterprise。 resource.webcontainer.jsf.application(默认任务-25)错误渲染视图[/stocks.xhtml]:java.lang.NullPointerException at org.primefaces.component.datatable.DataTable.findColumnInGroup(DataTable.java:905)[primefaces -5.2.jar:5.2] at org.primefaces.component.datatable.DataTable.findColumn(DataTable.java:896)[primefaces-5.2.jar:5.2] at org.primefaces.component.datatable.DataTable.getSortColumn( DataTable.java:1401)[primefaces-5.2.jar:5.2] at org.primefaces.component.datatable.fea ture.SortFeature.singleSort(SortFeature.java:136)[primefaces-5.2.jar:5.2] at org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:109)[primefaces-5.2.jar:5.2] (UIComponentBase.java:919)[jboss- jsf-api_2.2_spec-2.2.8.jar:2.2.8] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)[jboss-jsf-api_2.2_spec-2.2.8.jar:2.2 .8] at com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:104)[jsf-impl-2.2.8-jbossorg-1.jar:] at 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] at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)[jboss-jsf-api_2.2_spec -2.2.8.jar:2.2.8] at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)[jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)[jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] at javax.faces.component.UIComponent.encodeAll(UIComponent.java :1859)[jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] at 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:

+0

这是一个ajax或非Ajax刷新?也通常我猜你会有例如var =“item”和sortBy =“#{item.prop1}” –

+0

这是一个非Ajax刷新。是的,我喜欢var =“item”和sortBy =“#{item.prop1}”。以上只是一个缩写。 – Frank

回答

0

你试过用不同的形式为每个数据表?像这样:

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

1

的解决方案是增加rowStatePreserved = “真”,以含有其它表的表。这是在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"> 
... 
+0

如果数据表在一个迭代器中,这确实是一个鲜为人知的'技巧'来解决一些问题。 PrimeFaces 5.3.something和6.0有一些额外的东西来实现,以防止问题在迭代器中 – Kukeltje

0

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

我们有一个包含两个表格的表单,并且可以通过值列表(filterMatchMode exact)或通过输入文本(filterMatchMode contains)过滤特定列。 第一个表格没有工作过滤器(我们遇到了和你一样的NullPointerException),第二个工作正常。

两个表是在一个组成部分,过滤和排序的两个表中的列是与JSTL这样conditionnaly建:

<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>

希望它有帮助。

相关问题