-1

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

在参考primefaces 展示时,我为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;
     }
}

我使用以下数据表来呈现这个:

<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 为空,保存节点条目以更新表。不会抛出任何 JavaScript 错误,并且每次击键都会更改随“表数据”一起发送的视图状态 ID。

4

2 回答 2

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。它将更好地利用您的服务器资源。

于 2013-10-16T14:23:37.097 回答
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());
 }

没有为 filterAttribute 提供任何值,因此您在进行过滤时会看到一个空白的 dataTable。

希望这可以帮助

于 2013-10-16T13:01:44.587 回答