代码之家  ›  专栏  ›  技术社区  ›  jMarcel

如何通过远程命令执行方法来重置数据表过滤器?

  •  0
  • jMarcel  · 技术社区  · 8 年前

    在下面的index.xhtml页面中,我有三个commandbuttons,单击后会重定向到另一个包含数据表的.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>
    

    在另一个.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>
    

    当我点击时 过滤器3 按钮,将加载另一个包含数据表的.xhtml, 完成时 ,将按预期筛选数据表。但是如果我点击另一个过滤按钮(例如 过滤器2 )之前应用的过滤器保持活动状态,导致不需要的过滤;这 以前应用的筛选器 如果再次单击相应的筛选按钮,则禁用。

    我试过用 remote command 调用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 回复  |  直到 8 年前
        1
  •  0
  •   Oscar Pérez    8 年前

    我认为有一种更清洁、更简单的方法:

    您的过滤器按钮的操作应该调用一个托管bean方法,该方法清除过滤器,然后重定向到 another.xhtml .比如:

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

    在托管bean中:

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

    这将清除过滤器 之前 页面已加载。