繁体   English   中英

jsf primefaces数据表过滤问题

[英]jsf primefaces datatable filtering issues

我正在使用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> 

您可以改为执行以下操作,而不是直接使用模型中的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。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM