Tin*_*iny 2 datatable jsf primefaces jsf-2.2
由于 PrimeFaces 尚不支持<p:dataTable>过滤器的转换器,我正在尝试实现我自己的自定义过滤器<p:calendar>(当然,这个过滤器的设计看起来仍然有些丑陋。它需要应用我不能的正确 CSS)。
<p:column id="discountStartDate" sortBy="#{row.discountStartDate}" style="width:140px;">
<f:facet name="header">
Start Date<br/>
<p:calendar id="startDateFilter" converter="#{dateTimeConverter}"
timeZone="Asia/Kolkata" locale="#{localeBean.locale}"
pattern="dd-MMM-yyyy hh:mm:ss a"
readonly="#{facesContext.currentPhaseId.ordinal eq 6}"
label="Start Date"
effect="slide" required="true"
size="12"
showButtonPanel="true" navigator="true">
<p:ajax event="dateSelect" listener="#{discountManagedBean.startDateListener}"
onstart="PF('blockDataTableUIWidget').block()"
oncomplete="PF('blockDataTableUIWidget').unblock()"
update="dataTable"/>
</p:calendar>
</f:facet>
<!--No need to refer to-->
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{row.discountStartDate}" converter="#{dateTimeConverter}"/>
</f:facet>
<f:facet name="input">
<p:tooltip for="dataTableTxtDiscountStartDate" value="#{messages['tooptip.dataTable.popup.calendar']}"/>
<p:calendar id="dataTableTxtDiscountStartDate" binding="#{edStartDate}" value="#{row.discountStartDate}" converter="#{dateTimeConverter}" timeZone="Asia/Kolkata" locale="#{localeBean.locale}" pattern="dd-MMM-yyyy hh:mm:ss a" readonly="#{facesContext.currentPhaseId.ordinal eq 6}" label="#{messages['discount.startdate']}" effect="explode" required="true" showButtonPanel="true" navigator="true"/>
</f:facet>
</p:cellEditor>
</p:column>
Run Code Online (Sandbox Code Playgroud)
从日历中选择日期时,将<p:ajax>调用 中指定的侦听器。
public void startDateListener(SelectEvent event)
{
if(event.getObject() instanceof DateTime)
{
//org.joda.time.DateTime
DateTime startDate=(DateTime) event.getObject();
System.out.println(startDate+" : "+startDate.getZone().getID()+ " : "+startDate.getZone());
}
}
Run Code Online (Sandbox Code Playgroud)
在此方法中检索所选日期,但如何在该方法中使用此日期load()?<p:dataTable>使用org.primefaces.model.LazyDataModel<Discount>.
有没有办法从这个监听器方法中使用这个日期,以便数据表 -<p:dataTable>可以在根据日历提供的日期过滤行后更新 - <p:calendar>?
如何在重写load()方法中使用此日期?
@Override
public List<Discount> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, String> filters)
{
//Do something with filters to add the date selected from the calendar of the given filter we are talking about.
return discountService.getList(first, pageSize, multiSortMeta, filters);
}
Run Code Online (Sandbox Code Playgroud)
2014 年 5 月 5 日发布的PrimeFaces 5.0 最终版对数据表过滤器进行了重大改进。
PrimeFaces DataTable Filtering 一直是使用 ajax 快速过滤数据的有用功能。然而,有两个主要限制;它仅基于字符串比较,不支持自定义过滤实现。由于 PrimeFaces PRO 的赞助,PF5 的过滤得到了极大的增强。
过滤面
过滤元素仅限于输入文本和本机下拉列表,现在如果使用过滤器构面定义输入组件,则它成为过滤器。这实现了可定制的 UI、对过滤器的 ajax 更新支持、使用对象而不是简单的字符串作为过滤器值等等。
http://blog.primefaces.org/?p=3084
例如,
<p:column id="id" headerText="#{messages['id']}" sortBy="#{row.discountId}" filterBy="#{row.discountId}" filterMatchMode="exact">
<f:facet name="filter">
<p:inputText onkeyup="PF('dataTableUIWidget').filter();" converter="javax.faces.Long" class="ui-column-filter"/>
</f:facet>
<h:outputText value="#{row.discountId}"/>
</p:column>
Run Code Online (Sandbox Code Playgroud)
discountId将由Long指定的转换器转换为。dataTableUIWidget是widgetVar的<p:dataTable>。
在 的情况下LazyDataModel<T>,Map过滤器的类型已更改为Map<String, Object>(从Map<String, String>)该load()方法的两个重载版本。
对于单列排序,
@Override
public List<Type> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
return super.load(first, pageSize, sortField, sortOrder, filters);
}
Run Code Online (Sandbox Code Playgroud)
和多列排序。
@Override
public List<Type> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
return super.load(first, pageSize, multiSortMeta, sortOrder, filters);
}
Run Code Online (Sandbox Code Playgroud)
至于问题中的示例,可以将其改写如下。
<p:column id="discountStartDate" headerText="#{messages['discount.startdate']}" filterBy="#{row.discountStartDate}" sortBy="#{row.discountStartDate}" width="200" style="text-align: right;">
<f:facet name="filter">
<p:calendar id="filterStartDate" converter="#{dateTimeConverter}"
timeZone="Asia/Kolkata" locale="#{localeBean.locale}"
pattern="dd-MMM-yyyy hh:mm:ss a"
readonly="#{facesContext.currentPhaseId.ordinal eq 6}"
label="#{messages['discount.startdate']}"
effect="slide"
size="12"
onclick="PF('filterStartDateWidget').setDate(null);PF('dataTableUIWidget').filter();"
widgetVar="filterStartDateWidget"
showButtonPanel="true" navigator="true">
<p:ajax event="dateSelect"
onstart="PF('dataTableUIWidget').filter();PF('blockDataTableUIWidget').block();"
oncomplete=" PF('blockDataTableUIWidget').unblock();"
onerror="alert('error');"/>
</p:calendar>
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{row.discountStartDate}" converter="#{dateTimeConverter}"/>
</f:facet>
<f:facet name="input">
<p:tooltip for="dataTableTxtDiscountStartDate" value="#{messages['tooptip.dataTable.popup.calendar']}"/>
<p:calendar id="dataTableTxtDiscountStartDate" binding="#{edStartDate}" value="#{row.discountStartDate}" converter="#{dateTimeConverter}" timeZone="Asia/Kolkata" locale="#{localeBean.locale}" pattern="dd-MMM-yyyy hh:mm:ss a" readonly="#{facesContext.currentPhaseId.ordinal eq 6}" label="#{messages['discount.startdate']}" effect="explode" required="true" showButtonPanel="true" navigator="true"/>
</f:facet>
</p:cellEditor>
</p:column>
Run Code Online (Sandbox Code Playgroud)
dateTimeConverter是 的一种org.joda.time.DateTime。因此,通过此过滤器的日期将org.joda.time.DateTime在刚刚Object从过滤器中取出后可用Map。
| 归档时间: |
|
| 查看次数: |
8654 次 |
| 最近记录: |