Primefaces 4.0 - 分页数据表过滤问题

时间:2013-10-16 12:40:18

标签: java jsf primefaces

我构建了一个相对简单的DataTable,并尝试使用过滤器功能并使用分页功能。

参考primefaces showcase我为Customer课程中的每个字段创建了一个列。

这是我的“控制器”Bean:

@SessionScoped
@Named

public class CustomerListController implements Serializable{

     public static final long serialVersionUID = //UID;

     private List<Customer> filteredCustomers;

     private List<Customer> allCustomers;

     public CustomerListController(){
         //some Class that generates a list of sufficiently many 
         //dummy customers on instantiation
         this.allCustomers = new CustomerListProducer().getCustomers();
     }

     public List<Customer> getFilteredCustomers{
         return this.filteredCustomers;
     }

     public void setFilteredCustomers(List<Customers> list){
         this.filteredCustomers = list;
     }

     public List<Customer> getAllCustomers(){
         return this.allCustomers;
     }
}

我使用以下dataTable来渲染:

<p:dataTable paginator="true" rows="18" scrollRows="15" scrollable="true" 
   scrollHeight="500" var="customer" value="#{customerListController.allCustomers}" 
   scrollable="true" id="customerTable" 
   filteredValue="#{customerListController.filteredCustomers}" widgetVar="table">

   <f:facet name="header">
      <p:outputPanel>
        <h:outputText value="Search all fields:" />
        <h:inputText id="globalFilter" onkeyup="table.filter()" />
      </p:outputPanel>
   </f:facet>

   <p:Column id="nameColumn" filterBy="name" sortBy="name"
      headerText="Customer" filterMatchMode="contains">
      <h:outputText value="#{customer.name}" />
   </p:Column>

   <!-- Some more columns in the exactly same 
    manner as this changes only in Customer attribute-->

</p:dataTable>

当我在任何给定的过滤器字段中按任意键时,表会丢失所有行,即使清除字段也不会显示任何行。

刷新页面时,我会获得预期的行数和数量。页。

我会尽力按要求提供修正案。

编辑:

我正在使用与maven一起安装的Primefaces 4.0.0版 我一直在FF下挖掘控制台并发现以下内容:
响应XML为空,保存节点Entry for updated table。没有抛出任何JavaScript错误,并且随着每次击键,随“table data”发送的viewstate id都会发生变化。

2 个答案:

答案 0 :(得分:1)

您的filterBy和sortBy必须包含延迟的EL表达式。

<p:Column id="nameColumn" filterBy="#{customer.name}" sortBy="#{customer.name}"
  headerText="Customer" filterMatchMode="contains">
  <h:outputText value="#{customer.name}" />
</p:Column>

<强>更新 由于我可以确认EL和非EL方法都适用于PF V4.0,因此这是您的问题的另一个可能的答案:

请检查您的SessionScoped导入。

我无法使用javax.faces.bean.SessionScoped使其工作。 使用javax.enterprise.context.SessionScoped它可以工作。

我个人尽可能避免使用SessionScoped范围,尝试使用ConversationScoped代替。它将更好地利用您的服务器资源。

答案 1 :(得分:0)

替换您的代码
public CustomerListController(){
     //some Class that generates a list of sufficiently many 
     //dummy customers on instantiation
     this.allCustomers = new CustomerListProducer().getCustomers();
     this.setFilteredCustomers(this.getAllCustomers());
 }

没有为过滤器属性提供任何值,因此在进行过滤时会看到空白的dataTable。

希望这有帮助