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