2011-12-16 50 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