Как отфильтровать данные по диапазону целых чисел? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть dataTable на моей странице JSF, где я перечисляю все свои объекты. Обычно я использую filterBy и filterMatchMode для выполнения этого типа операции, но в этом случае мне нужно отфильтровать список для данного столбца, для диапазона значений. Как я могу добиться этого?

<p:dataTable id="dtOrders" var="productionOrder"
                        value="#{productionOrdersView.orders}" selectionMode="single"
                        reflow="true" selection="#{productionOrdersView.selected}"
                        filteredValue="#{productionOrdersView.filtered}"
                        widgetVar="ordersTable" rowKey="#{productionOrder.pk}"
                        paginator="true" rows="20">
                        <f:facet name="header">
                           Bolle di lavorazione
                        </f:facet>
                        <p:column headerText="Numero bolla"
                            sortBy="#{productionOrder.orderNumber}"
                            filterFunction="#{productionOrdersView.filter()}"
                            filterOptions="contains">
                            <f:facet name="filter">
                                <h:inputHidden id="filter" />
                            </f:facet>
                            <f:facet name="header">
                                <h:outputText value="Numero bolla" />
                                <h:outputText value="Dalla" />
                                <p:inputText id="from"
                                    value="#{productionOrdersView.orderNumberStartFilter}">
                                    <p:ajax event="keyup" />
                                </p:inputText>
                                <h:outputText value="alla" />
                                <p:inputText id="to"
                                    value="#{productionOrdersView.orderNumberEndFilter}">
                                    <p:ajax event="change"
                                        listener="#{productionOrdersView.filter()}" update="dtOrders"
                                        oncomplete="PF('dtOrders').filter()" />
                                </p:inputText>
                            </f:facet>
                            <h:outputText value="#{productionOrder.orderNumber}" />
                        </p:column>

И метод bean:

public void filter() {
    System.out.println("Filtering...");
    System.out.println(orderNumberStartFilter+" "+orderNumberEndFilter);
    if(orderNumberStartFilter!=null && orderNumberEndFilter!=null) {
        this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberEndFilter));
    }else {
        if(orderNumberStartFilter!=null) {
            this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberStartFilter));
            return;
        }
        if(orderNumberEndFilter!=null) {
            this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberEndFilter), Integer.valueOf(orderNumberEndFilter));
            return;
        }
        this.filtered = orders;
    }
    System.out.println(filtered.size());
}

Как я могу отфильтровать список? Это хороший подход для выполнения этой операции? Также я хочу, чтобы, если было вставлено только одно значение, операция фильтрации была сделана равной (так точен этот порядок). Я искал в Интернете, и я видел много примеров для даты, но ничего для целочисленных значений.

Обновление

    list.xhtml:72 Uncaught TypeError: Cannot read property 'filter' of undefined
    at Object.onco (list.xhtml:72)
    at Object.<anonymous> (core.js.xhtml?ln=primefaces&v=7.0:3)
    at u (jquery.js.xhtml?ln=primefaces&v=7.0:2)
    at Object.fireWith [as resolveWith] (jquery.js.xhtml?ln=primefaces&v=7.0:2)
    at k (jquery.js.xhtml?ln=primefaces&v=7.0:2)
    at XMLHttpRequest.<anonymous> (jquery.js.xhtml?ln=primefaces&v=7.0:2)
onco @ list.xhtml:72
(anonymous) @ core.js.xhtml?ln=primefaces&v=7.0:3
u @ jquery.js.xhtml?ln=primefaces&v=7.0:2
fireWith @ jquery.js.xhtml?ln=primefaces&v=7.0:2
k @ jquery.js.xhtml?ln=primefaces&v=7.0:2
(anonymous) @ jquery.js.xhtml?ln=primefaces&v=7.0:2

1 Ответ

0 голосов
/ 15 октября 2019

Создайте свой код таким образом

xhtml

 <p:column headerText="Order number" sortBy="#{productionOrder.orderNumber}"
      filterFunction="#{productionOrdersView.filter()}"
      filterMatchMode="contains">
          <f:facet name="filter">
               <h:inputHidden id="filter"/>
          </f:facet>
          <f:facet name="header">
      <p:inputText id="from" value="#{productionOrdersView.from}">
          <p:ajax event="keyup" />
      </p:inputText>
      <h:outputText class="fa fa-arrows-h fa-2x" style="vertical-align: middle;"/>
     <p:inputText id="to" value="#{productionOrdersView.to}">
          <p:ajax event="change"  
               listener="#{productionOrdersView.filter()}" update="your_dataTable_Id" 
               oncomplete="PF('your_dataTable_widgetVar').filter()"/>
      </p:inputText>
           </f:facet>
      <h:outputText value="#{productionOrdersView.orderNumber}" />
  </p:column>

В компоненте создайте 2 целочисленные переменные from to с помощью методов получения и установки и используйте метод o для фильтрации ваших данных.

 private Integer from;
 private Integer to;
 ..............

 //Method that filter the data
 public void filter(){
   //Filter your data between from - to 
 .......................
    }
}

Вы можете улучшить этот код, но я думаю, что это хорошая база.


ОБНОВЛЕНИЕ ОТВЕТА

Проблема с вашим кодом заключается в том, что вы непоместите отфильтрованный список в качестве значения в таблицу данных. Для работы этого кода вы можете сделать 2 вещи. ( Выполните одно из них )
1) Измените отфильтрованную функцию, как показано ниже.

public void filter() {
System.out.println("Filtering...");
System.out.println(orderNumberStartFilter+" "+orderNumberEndFilter);
if(orderNumberStartFilter!=null && orderNumberEndFilter!=null) {
    this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberEndFilter));
}else {
    if(orderNumberStartFilter!=null) {
        orders = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberStartFilter));
        return;
    }
    if(orderNumberEndFilter!=null) {
        orders = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberEndFilter), Integer.valueOf(orderNumberEndFilter));
        return;
    }

}
System.out.println(orders.size());

} ​​

2) Измените переменную в коде значения с датой.

<p:dataTable id="dtOrders" var="productionOrder"
                    value="#{productionOrdersView.filtered}" selectionMode="single"
                    reflow="true" selection="#{productionOrdersView.selected}"
                    widgetVar="ordersTable" rowKey="#{productionOrder.pk}"
                    paginator="true" rows="20">
  .................
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...