jsf primefaces数据表过滤问题

时间:2011-01-25 13:04:29

标签: jsf primefaces

我正在使用primefaces及其数据表。几列是日期或货币。如果我试图过滤那些,那就有尴尬的行为。当我开始输入时,过滤器一直工作到第一个分隔符(例如日期点,所以它只过滤11个。下一个字符让表格显示没有条目)。

是否可以应用日期转换器?

以下是我的代码:

<p:column filterBy="#{cou.startDate}"
    headerText="#{text['date']}"
    filterMatchMode="contains" 
    sortBy="#{cou.startDate}" >
        <h:outputText value="#{cou.startDate}" >
             <f:convertDateTime pattern="dd.MM.yyyy" />
        </h:outputText>
</p:column> 

3 个答案:

答案 0 :(得分:3)

您可以改为执行以下操作,而不是直接使用模型中的cou.startDate:

在模型类中创建一个新的瞬态属性。

@Transient
private String dateForFilter;
public String getDateForFilter() {
 return dateForFilter;
}
public void setDateForFilter(String dateForFilter) {
 this.dateForFilter = dateForFilter;
}

在返回数据模型之前创建以下逻辑。

public List<Item> getDataModel() {
   List<Item> lstItem = serviceClass.loadItem(userid);
   for (Item item : lstItem) {
      DateFormat dateFormat = null;
      Date date = item.getDate;
      dateFormat = new SimpleDateFormat("MM/dd/yyyy kk:mm");
      item.setDateForFilter(dateFormat.format(date));
   }

   return lstItem;
}

更新您的XHTML以使用dateForFilter属性。

<p:column filterBy="#{item.dateForFilter}">
  <f:facet name="header">
    Transaction Date
  </f:facet>
  <h:outputText value="#{item.dateForFilter}" />
</p:column>

注意:如果您没有使用日期来更新模型类的内容,则只能使用此项。

HTH。

答案 1 :(得分:2)

据我所知,您不能使用转换器作为过滤器值。但是,您可以在bean / service / dao逻辑中处理它。

如果过滤列匹配某些名称(如startDate或endDate),您可以对逻辑进行硬编码并使用SimpleDateFormat来解析值。更通用的方法是使用反射来获取与列关联的类,如果是Date,则使用SimpleDateFormat,如果是数字则使用DecimalFormat等等。

当然,如果您将该查询传播到数据库,您将无法使用like运算符。如果您使用的是数字,则需要比较相等(同样适用于日期)。如果你正在寻找内存中的东西,你将不得不改变你的逻辑。但它不应该太糟糕。如果您可以发布一些支持bean /服务代码,我想我可能会更有帮助;)

答案 2 :(得分:2)

在primefaces中还没有现成的日期过滤机制,但是有可能使用自定义过滤器按日期过滤。您必须为列定义标题构面并使用ajax调用进行“手动”过滤,但它确实有效:

<f:facet name="header">DateRange
  <div>
    <p:calendar id="from" value="#{bean.from}" styleClass="calendarFilter">
      <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/>
    </p:calendar>
    <p:calendar id="to" value="#{bean.to}" styleClass="calendarFilter">
      <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/>
    </p:calendar>
  </div>
</f:facet>