【问题标题】:Filter datatable by selectOneMenu's default value after page load页面加载后通过selectOneMenu的默认值过滤数据表
【发布时间】:2014-10-20 12:17:41
【问题描述】:

我需要按默认值过滤数据表(请参阅 selectOneMenu 'chkNot',在这种情况下为 false)页面加载后

当前情况:过滤器值被选中,但数据表没有被过滤。如果我更改该值,则效果很好。

<ui:composition template="templates/layout.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:components="http://java.sun.com/jsf/composite/components"
                xmlns:p="http://primefaces.org/ui" >

  <ui:define name="title">Test Page</ui:define>
  <ui:define name="content">

        <h:form id="tranForm">
          <p:dataTable value="#{myBean.ordersAll}" var="order" 
                        id="myDTable" widgetVar="myDTable"
                        filteredValue="#{myBean.ordersAllFiltered}">

              <p:column filterBy="#{order.selected}" filterMatchMode="exact" headerText="Filter">
                  <f:facet name="filter">
                      <p:selectOneMenu id="chkNot" widgetVar="chkNot" 
                                        value="#{false}" 
                                        onchange="PF('myDTable').filter()" >
                      <f:selectItem itemLabel="All" itemValue="#{null}" noSelectionOption="true" />
                      <f:selectItem itemLabel="Yes" itemValue="#{true}" />
                      <f:selectItem itemLabel="No" itemValue="#{false}" />
                    </p:selectOneMenu>
                  </f:facet>
                  <h:outputText value="#{order.selected}"/>
              </p:column>

          </p:dataTable>
    </h:form>
  </ui:define>
</ui:composition>

【问题讨论】:

    标签: jsf primefaces datatable


    【解决方案1】:

    过滤器功能由 PF('myDTable').filter() 触发,因此您需要在页面加载时触发该事件。一种方法是使用 javascript,例如:

    <script  type="text/javascript" target="body">
    $j = jQuery;
    $j(document).ready( function() {
    PF('myDTable').filter();   
    });
    </script>  
    

    更新:

    另一种方法是从 backing bean 执行过滤器功能:

    public void executeFilter() {
        RequestContext rc = RequestContext.getCurrentInstance();
        rc.execute("PF('myDTable').filter();");
    }
    

    【讨论】:

    • 我在 tranForm.Firefox 显示“TypeError: PF(...) is undefined”,Chrome 显示“Uncaught TypeError: Cannot read property 'filter' of undefined”之前粘贴了您的代码
    • 那是因为在您调用 JS 函数时,widgetVar="myDTable" 尚未在 DOM 树中构建。将脚本代码移到表单下方。此外,由于您打算将其放在您的身体内,您可以删除 target="body"
    • 如果我将 selectOneMenu chkNot value="#{false}" 更改为 value="false",两种方法都有效。否则它会一直给java.lang.NullPointerException。谢谢!
    猜你喜欢
    • 2018-04-05
    • 2020-02-14
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多