2013-02-26 96 views
0

我使用primefaces 3.1,我有一个数据表显示分页数据,其列基于页面数据构建,并通过<p:columns/>标记呈现。采用这种方法,同一个数据表的不同页面可以有不同的列。我想它会默认重新呈现分栏上的列,但事实并非如此。我试过<p:ajax event="page" update="myTable"/><p:ajax event="page" update="myTableContainer"/>运气好。如何在分页后刷新数据表动态列

有没有办法在触发分页时重新呈现整个数据表,所以不仅内容而且列标题都能正确显示?

编辑:继承人一些代码示例,如您所请求。

香港专业教育学院做了我自己的实现LazyDataModel和扩展其覆盖负载方法实现:

@Override 
public List<StockItem> load(int i, int i1, String string, SortOrder sortOrder, Map<String, String> map) { 
    List<StockItem> stockItems = super.load(i, i1, string, sortOrder, map); 
    inventoryMovements = service.listInventoryMovements(stockItems, fromDate, toDate); 
    stockOperations = new HashSet<StockOperation>(); 
    quantityTypes = new HashSet<QuantityType>(); 
    for (Map.Entry<StockItem, ItemMovements> entry : inventoryMovements.entrySet()) { 
     quantityTypes.addAll(entry.getValue().getStartingQuantities().keySet()); 
     quantityTypes.addAll(entry.getValue().getEndingQuantities().keySet()); 
     stockOperations.addAll(entry.getValue().getOperationsApplied().keySet()); 
    } 
    return stockItems; 
} 

当你的方法看,我在每一个页面加载填补两者stockOperationsquantityTypes。这两个对应于我的实际页面列。 (这是我LazyDataModel实施atributes与它们对应的getter)

<p:dataTable id="movementsTable" var="item" 
           value="#{inventoryMovementsBean.view}" 
           rowIndexVar="rowIndex" 
           paginator="true" 
           rows="25"> 
         <p:column headerText="Item"> 
          <h:outputText value="#{item.label}" /> 
         </p:column> 
         <p:columns value="#{inventoryMovementsBean.view.quantityTypes}" var="quantityType" columnIndexVar="quantityTypeIndex"> 
          <f:facet name="header"> 
           #{quantityType.description} 
          </f:facet> 
          <h:outputText value="#{inventoryMovementsBean.view.getStartingQuantity(item, quantityType)} => #{inventoryMovementsBean.view.getEndingQuantity(item, quantityType)}" /> 
         </p:columns> 
         <p:columns value="#{inventoryMovementsBean.view.stockOperations}" var="stockOperation" columnIndexVar="stockOperationIndex"> 
          <f:facet name="header"> 
           #{stockOperation.name} 
          </f:facet> 
          <h:outputText value="#{inventoryMovementsBean.view.getOperationValue(item, stockOperation)}" /> 
         </p:columns> 
        </p:dataTable> 

inventoryMovementsBean.view是我LazyDataModel实例和方法getOperationValue(项目,stockOperation),getStartingQuantity(项目,quantityType)和getEndingQuantity(项目,quantityType)是给我的内容给予一个项目和一列。

我已经做了一个调试,并且我很确定整个数据都是加载的,这只是一个显示问题。以下是一些截图作为附加信息。

Initial render Actual render after pagination Expected render after pagination

这些图像对应于:

  • 初始渲染(第1页)。
  • 实际渲染分页(第3页)
  • 预计分页后渲染(第3页)之后
+0

是您的托管bean至少'@ ViewScoped',和您的数据保存你的''坚持在每一个新的页面调用? – 2013-02-26 22:05:48

+0

是的。我的问题基本上是rerendereing列标题,页面内容显示为所需 – Juan 2013-02-27 04:19:57

+0

我想如果你分享一个[SSCCE](http://sscce.org)你的代码,以帮助你,这将是伟大的。 – 2013-02-27 04:56:09

回答

0

如果使用Primefaces,有没有像lazyLoading.If指定true,那么所有客户端的选项东西会在服务器处理side.For更

http://www.primefaces.org/showcase/ui/datatableLazy.jsf

+1

它已经默认为'false',整个设置在技术上与OP的具体问题无关。 – BalusC 2013-02-27 11:10:32