过滤期间过滤器不会从只读字段中获取值

时间:2016-07-12 13:02:14

标签: jsf primefaces filter datatable

我使用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属性) ,但也许你知道一些不同的方法来实现这一点。

3 个答案:

答案 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)

所选答案的实施

  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>
    
  2. 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>