【问题标题】:jsf primefaces datatable filtering issuesjsf primefaces 数据表过滤问题
【发布时间】:2011-01-25 13:04:29
【问题描述】:

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

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-24
          • 2014-01-25
          • 1970-01-01
          • 2013-07-30
          • 1970-01-01
          • 2014-03-01
          • 1970-01-01
          相关资源
          最近更新 更多