2011-12-16 51 views
3

我對RichFace的(3.3.3)TabPanel有個疑問。我曾參與過使用TabPanel的兩個項目。在每個項目上,我都注意到在不可見的選項卡上的組件仍然有其調用的「getter」方法。Rich TabPanel的getters在標籤內容未呈現時調用

例如,第一片具有在一個數據表和任何時間請求從任何其他片(包括AJAX請求)被綁定到DataTable在第一選項卡仍具有豆製成它的吸氣劑叫。

我認爲會發生這種情況(即使該選項卡當前未在UI中呈現),因爲該組件仍處於組件層次結構中?換句話說,所有組件都是父標籤面板的子組件,因此每個請求都會被處理。即使它們不可見也是如此。

好吧......如果我的假設是真的,那麼我需要一種方法來有數據檢索邏輯調用的未使用的標籤。我讀過關於懶惰加載數據的帖子(不把數據檢索邏輯放在getter中),因爲getter可能會被調用很多次。我正在盡力堅持這一點;我看到的問題是,即使我已經將綁定到表的bean(在選項卡上)與請求範圍一起定義,並且getter將懶惰地加載表的數據,但bean會被實例化,並且數據(懶洋洋地),從其他選項卡的每個ajax請求。

有一種方法可以解決所有內容脫離RichFace的TabPanel並滾動我自己的問題。

我試着讓綁定到表會話的bean作用域,並「緩存」getter返回的表的數據,但問題是沒有生命週期方法綁定到當tab再次呈現時(通過手動點擊選項卡或以編程方式選擇選項卡)。

我會很感激任何建議。

+0

好問題。我與我的標籤面板完全一樣的問題,但是當我嘗試將一個服務器端方法(使用ajax支持)連接到ontabenter方法(爲特定選項卡執行數據檢索)時,我的方法不會被打中在所有。顯然不是這樣設計的?令人沮喪。 – Lisa 2013-10-29 05:21:12

回答

1

tabPanel有一個名爲selectedTab的屬性,每次選中某個選項卡時都會調用getter/setter。您可以使用setter方法在選擇特定選項卡時刷新數據。您還可以通過將選項卡的內容封裝在c:if元素中來防止在每個選項卡中調用getter方法,如果測試返回false,則會停止html的該段。例如:

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:rich="http://richfaces.org/rich 
    xmlns:c="http://java.sun.com/jstl/core"> 
    <rich:tabPanel selectedTab="#{pageScopedBean.selectedTab}"> 
     <rich:tab id="particularTab" label="A Tab"> 
      <c:if test="#{pageScopedBean.selectedTab eq 'particularTab'}"> 
       <!-- tab contents --> 
      </c:if> 
     </rich:tab> 
    </rich:tabPanel> 
</ui:composition> 

然後在Java中,對pageScopedBean創建getter和setter方法:

@Name("pageScopedBean") 
@Scope(ScopeType.PAGE) 
public class PageScopedBean { 
    private String selectedTab = ""; 
    public String getSelectedTab() { 
     return selectedTab; 
    } 
    public void getSelectedTab(String selectedTab) { 
     this.selectedTab = selectedTab; 
     if (this.selectedTab == "particularTab") { 
      // refresh table 
     } 
    } 
+2

我認爲你的建議可行,但它們是對於RichFaces標籤面板有缺陷的東西的解決方法! – Lisa 2013-10-29 05:18:39