我正在使用PF 3.4并尝试过滤具有枚举值的列。我正在使用jsf 2.0的枚举转换器。但过滤对我来说不起作用的是示例代码:
<p:dataTable id="projeTeklifiListesiDataTable"
value="#{controller.model.projeTeklifiListesi}"
var="proje" paginator="true" rowKey="#{proje.id}"
rows="50"
selection="#{controller.model.secilenProjeTeklifi}"
selectionMode="single" styleClass="defaultList">
<p:column headerText="#{etiket['pfdy_hzrl_vt013']}"
filterBy="#{projeTeklifi.projeTeklifiDurumu}"
filterOptions="#{controller.model.projeTeklifiDurumuListesi}"
sortBy="#{projeTeklifi.projeTeklifiDurumu.toString()}">
#{proje.projeTeklifiDurumu.toString()}
</p:column>
<p:column headerText="#{etiket['pfdy_dkd_vt010']}" filterBy="#{projeTeklifi.basariDurumu}"
filterOptions="#{controller.model.basariDurumuListesi}"
sortBy="#{projeTeklifi.basariDurumu.toString()}">
#{proje.basariDurumu.toString()}
</p:column>
</p:dataTable>
这是过滤器选项的列表
public SelectItem[] getProjeTeklifiDurumuListesi()
{
final ProjeTeklifiDurumu[] durumListesi = ProjeTeklifiDurumu.values();
final SelectItem[] projeTeklifiDurumListesi = new SelectItem[durumListesi.length+1];
projeTeklifiDurumListesi[0] = new SelectItem("", "Seçiniz");
for(int i =0;i<durumListesi.length;i++)
{
final SelectItem select = new SelectItem(ProjeTeklifiDurumu.valueOf(durumListesi[i].name()),durumListesi[i].toString());
projeTeklifiDurumListesi[i+1]=select;
}
return projeTeklifiDurumListesi;
}
public SelectItem[] getBasariDurumuListesi()
{
final BasariDurumu[] durumListesi = BasariDurumu.values();
final SelectItem[] projeTeklifiDurumListesi = new SelectItem[durumListesi.length+1];
projeTeklifiDurumListesi[0] = new SelectItem("", "Seçiniz");
for(int i =0;i<durumListesi.length;i++)
{
final SelectItem select = new SelectItem(durumListesi[i],durumListesi[i].toString());
projeTeklifiDurumListesi[i+1]=select;
}
return projeTeklifiDurumListesi;
}
我尝试过使用不同的值绑定为SelectedItem类绑定枚举本身,绑定枚举的名称,调用toString()方法,但它不会过滤。我可以看到我对过滤器选项的值绑定已正确发布但不过滤数据。
任何线索都会有所帮助。
谢谢。
答案 0 :(得分:2)
查看org.primefaces.component.datatable.DataHelper
void decodeFilters(FacesContext context, DataTable table) {
...
String columnValue = String.valueOf(column.getValueExpression("filterBy").getValue(context.getELContext()));
...
}
他们按原样解码该值,因此我认为不会使用转换器。