Как выполнить метод с помощью удаленной команды для сброса фильтров данных? - PullRequest
0 голосов
/ 27 июня 2018

На странице index.xhtml, как показано ниже, у меня есть 3 командные кнопки, которые при щелчке перенаправляют на другую страницу .xhtml, содержащую данные, и, при завершении , фильтруют ее:

<ui:composition>
  <h:form id="kpiForm">
     <p:panel id="kpiPanel" >
        <p:commandButton value="filter 1" action="/app/index" oncomplete=" $('#MyFormID\\:MyDatatableID\\:BoxID\\:1').click(); PF('wv').filter();" onclick="rc()" />
        <p:commandButton value="filter 2" action="/app/index" oncomplete=" $('#MyFormID\\:MyDatatableID\\:BoxID\\:2').click(); PF('wv').filter();" onclick="rc()" />
        <p:commandButton value="filter 3" action="/app/index" oncomplete=" $('#MyFormID\\:MyDatatableID\\:BoxID\\:3').click(); PF('wv').filter();" onclick="rc()" />
     </p:panel>
     <p:remoteCommand name="rc" actionListener="#{datatableController.clearAllFilters}" />
  </h:form>
</ui:composition>

В another.xhtml есть кнопка, которая при нажатии очищает все фильтры, применяемые к датируемой таблице:

<!-- some code ommited -->
<ui:composition [...]>
  <h:form id="OutsideFormID">
    <p:panel id="MyPanelID" header="Some Title">

      <p:commandButton value="Reset Table" onclick="PF('wv').clearFilters()" actionListener="#{datatableController.clearAllFilters}" update="MyDatatableID">
        <p:resetInput target="MyDatatableID" />
      </p:commandButton>

        <p:dataTable id="MyDatatableID"
        value="#{datatableController.items}"
        rowKey="#{item.id}"
        var="item"
        selection="#{datatableController.selected}"
        filteredValue="#{datatableController.filteredDemandas}"
        widgetVar="wv">

            <p:column id="MyColumnID" sortBy="#{item.status.statusName}" filterBy="#{item.status.statusName}" filterMatchMode="in" >
            <f:facet name="header">
                <h:outputText value="STATUS"/>
            </f:facet>
            <f:facet name="filter">
                <p:selectCheckboxMenu id="BoxID" widgetVar="BoxWV" label="status" onchange="PF('wv').filter()">
                    <f:selectItems id="ComboID" value="#{datatableController.statusListCombo}" />
                </p:selectCheckboxMenu>
            </f:facet>
            <h:outputText value="#{item.status.statusName}"/>
            </p:column>
        </p:dataTable>
    </p:panel>
  </h:form>
</ui:composition>

Когда я нажимаю кнопку filter 3 , загружается другой файл .xhtml, содержащий таблицу данных, и, при завершении , таблица данных фильтруется должным образом. Но если я нажму на другую кнопку фильтра (например, filter 2 ), ранее примененный фильтр останется активным, что приведет к нежелательной фильтрации; этот ранее примененный фильтр отключается, если я снова нажимаю на соответствующую ему кнопку фильтра.

Я пытался использовать удаленную команду для вызова метода clearAllFilters, но безуспешно.

public void clearAllFilters() {
  DataTable dataTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("OutsideFormID:MyDatatableID");

  if (!dataTable.getFilters().isEmpty()) {
  dataTable.reset();

  RequestContext requestContext = RequestContext.getCurrentInstance();
  requestContext.update("OutsideFormID:MyDatatableID");
  }
}

Как мне вызвать метод clearAllFilters, который будет выполняться каждый раз при нажатии на любую из кнопок фильтра (в kpiForm) и, при завершении , таблица данных будет отфильтрована?

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 27 июня 2018

Я думаю, что есть более чистый и простой подход:

Действия ваших кнопок фильтров должны вызывать метод управляемого компонента, который очищает фильтры и затем перенаправляет на another.xhtml. Что-то вроде:

    <p:commandButton value="filter 1" 
                     action="#{datatableController.pressedFilter1}" 
                     oncomplete=" $('#MyFormID\\:MyDatatableID\\:BoxID\\:1').click(); PF('wv').filter();" 
                     />

А в управляемом бобе:

 public String pressedFilter1(){
      this.clearAllFilters();
      return "/app/index.xhtml";
 }

Это очистит фильтры до загрузки страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...