2012-02-07 65 views
0

我想在要過濾的列的DataTable使用過濾器領域,並得到過濾列表(其中填充數據表)過濾列表和更新其他組件將根據(Toplam TL Teminati和Toplam豆撈Teminati)過濾列表中的值在我的頁面。獲取DataTable中

enter image description here

反正有沒有做到這一點的Primefaces 2.2.1和JSF 2?如果不是,你能否讚揚這種情況下的解決方法?

在此先感謝。

+1

是不是真的有一種能夠自動做到這一點,但也有一些自定義篩選邏輯,我能夠使用列過濾與異步更新過濾器按鈕和字段從託管bean過濾掉數據對象一起。你可以把自定義過濾器領域中的表頭,'中的 ...' – 2012-02-07 15:28:24

+0

所以你所做的就是那種讓自己的過濾是什麼? – lamostreta 2012-02-08 08:36:48

回答

2

爲了讓你的我怎麼在我的Primefaces實現自定義篩選邏輯2.2.1 dataTable的,我給你我的代碼縮放版本的例子。

<p:dataTable value="#{listBeans.beans}" var="bean" dynamic="true" paginator="true" rows="20" paginatorPosition="bottom" 
       emptyMessage="No Beans" loadingMessage="Loading. . ." selectionMode="single" selection="#{listBeans.selectedBean}" 
       id="beanList" widgetVar="beanTable"> 
     <f:facet name="header"> 
      <h:panelGrid columns="4"> 
       <h:outputText value="Bean List" /> 
       <p:outputPanel> 
        <h:outputText value="Year Filter: " /> 
        <h:selectOneMenu value="#{listBeans.yearFilter}" 
         onchange="yearFilterBtn.jq.click(); refreshFilters();"> 
         <f:selectItems value="#{listBeans.years}" /> 

        </h:selectOneMenu> 
        <p:commandButton id="yearFilterBtn" widgetVar="yearFilterBtn" action="#{listBeans.filterYears}" 
         update="listBeansForm:beanList" style="display:none;" /> 

       </p:outputPanel> 
       <p:outputPanel> 
        <h:outputText value="Filter By Beanchild: " /> 
        <p:inputText value="#{listBeans.beanchildFilter}" style="width: 150px; margin-right: 4px;" /> 
        <!-- refreshFilters forces the visitor filter to refresh the selection if column filters are selected. --> 
        <p:commandButton oncomplete="refreshFilters();" value="Filter" 
         action="#{listBeans.filterBeanchildren}" update="listBeansForm:beanList" /> 
       </p:outputPanel> 
       <p:commandButton value="Export to XLS" ajax="false"> 
        <p:dataExporter target="beanList" type="xls" fileName="BeanReport" 
         excludeColumns="0,5,6" postProcessor="#{listBeans.postProcessExcelReport}" /> 
       </p:commandButton> 
      </h:panelGrid> 
     </f:facet> 

     <p:column style="width:16px"> 
      <p:rowToggler /> 
     </p:column> 
     <p:column filterStyleClass="filtertag" filterBy="#{bean.beanDateDisplay}" filterMatchMode="startsWith"> 

.... 
    </p:dataTable> 

沒有真正考慮太多的細節有關託管Bean代碼,命令按鈕的行爲必然是經過過濾器參數到再次查詢數據庫的beans新列表我的BO層。 dataTable組件的顯式update需要刷新數據。

您會注意到,在未隱藏的顯式Beanchild篩選器按鈕上,我有一個oncomplete屬性,該屬性引用了一個名爲refreshFilters()的JavaScript函數。我不記得確切我有問題,但我認爲這是在2.2.1版本Primefaces的一個bug,當一列過濾器值存在,並且數據表本身中發生異步更新。這裏是JavaScript函數:

function refreshFilters() { 
    var filters = jQuery('.filtertag'); 
    var uppedOnce = false; 
    filters.each(function(idx) { 
     var curEl = jQuery(this); 
     if (curEl.val() != '') { 
      curEl.keyup(); 
      uppedOnce = true; 
     } 
    }); 

    if (!uppedOnce) { 
     jQuery(filters[0]).keyup(); 
    }   
} 

你可以在這裏看到我的定位具有類filtertag,這將是列篩選每一個DOM元素。我是說,如果在該領域存在的值後,服務器操作完成,然後我手動觸發keyup事件,因爲這將「重新過濾」與之前的前值的列。

我不確定在更高版本的Primefaces中是否有必要,我甚至不確定它現在是否有必要,所以我建議嘗試在沒有Javascript解決方法的情況下執行此操作,並且如果遇到兩個問題,那麼您可以考慮使用Javascript。

+0

非常感謝您的詳細解答。我會試一試。 – lamostreta 2012-02-09 13:48:17