我使用JSF 2.2,Primefaces 6.0和CDI。我有一个datatable
已经实现了延迟加载(datatable
从数据库中下载数据)。每列都有一个过滤字段。
其中一个列必须有readonly
过滤器字段(在显示datatable
之前,我在某个变量中保存了此过滤器的值)。因此,正如我所写,此过滤器字段应为readonly
(不可编辑),过滤器应将此字段中的值转换为过滤。 如何实现此功能?
我尝试添加inputtext
组件并设置readonly
属性:
<p:dataTable id="dataTableOfDataStore" var="obj" widgetVar="dataTableOfDataStoreVar"
value="#{formVisualizationController.dataTableLazy}"
lazy="true"
filteredValue="#{formVisualizationController.filteredDataTable}"
filterDelay="2000"
<!-- other attributes -->
>
<!-- other columns -->
<p:column headerText="Source IP" sortBy="#{obj.sip}"
filterBy="#{obj.sip}" filterMatchMode="contains">
<f:facet name="filter">
<p:inputText readonly="true" onchange="PF('dataTableOfDataStoreVar').filter()"
value="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}"
style="width: 100%; background-color: #0088cc; color: #ffffff;"/>
</f:facet>
<h:outputText value="#{obj.sip}" />
</p:column>
<!-- other columns -->
</p:dataTable>
不幸的是它不起作用。当我删除readonly
属性时,它可以正常工作,但过滤字段也可以编辑。
当然,我可以通过手动将此值传递给数据库查询来实现此目的,然后从列中删除过滤器并使inputtext
组件保留值(并使用readonly
属性) ,但也许你知道一些不同的方法来实现这一点。
答案 0 :(得分:1)
此answer解释了为什么readonly字段未包含在请求中。因此,Primefaces不会使用它来过滤。
在我看来,如果你想确保它没有被篡改,你将不得不在服务器端覆盖/检查它。因此,以编程方式设置它似乎是最好的解决方案。
您可以在查询中或通过以编程方式添加过滤器值来执行此操作。例如,如果必须,可以覆盖load方法以使用bean中的值。
dataTableLazy = new LazyDataModel<?>(){
public List<Site> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
//set your filter here
super.load(first, pageSize, sortField, sortorder, filters);
}
}
答案 1 :(得分:1)
修改JSF视图。我保留了inputtext
组件(带有readonly
属性),其中包含我的常量值,并且我删除了此列的过滤器功能(在客户端)。过滤器属性必须保留在<p:column>
组件中,否则您将无法在列的标题行中看到inputtext
组件。
<p:column headerText="Source IP" sortBy="#{obj.sip}"
filterBy="#{obj.sip}" filterMatchMode="contains">
<f:facet name="filter">
<p:inputText readonly="true" value="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}"
style="width: 100%; background-color: #0088cc; color: #ffffff;"/>
</f:facet>
<h:outputText value="#{obj.sip}" />
</p:column>
在load
方法中,我将我的值放入filters
参数中,该参数存储了过滤所需的所有值。
dataTableLazy=new LazyDataModel<Data>() {
@Override
public List<Data> load(int first, int pageSize, List<SortMeta> multiSortMeta,
Map<String, Object> filters) {
//here I put my value
filters.put("sip", selectedSourceIP.getIp());
List<Data> result=dataService.getLazyDataStoreTable(idSeletedUserTable, first, pageSize, multiSortMeta, filters);
//other code
return result;
}
};
答案 2 :(得分:-1)
我的想法是使用选择一个按钮来模拟只读过滤器字段,如下所示:
<p:column headerText="Source IP" sortBy="#{obj.sip}"
filterBy="#{obj.sip}" filterMatchMode="contains">
<f:facet name="filter">
<p:selectOneButton onchange="PF('dataTableOfDataStoreVar').filter()">
<f:selectItem itemLabel="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}"
itemValue="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}" />
</p:selectOneButton>
</f:facet>
<h:outputText value="#{obj.sip}" />
</p:column>