当Tab文件内容未呈现时,将调用Rich TabPanel的getter

时间:2011-12-16 14:34:35

标签: richfaces jsf-1.2 tabpanel

我对RichFace(3.3.3)TabPanel有疑问。我参与了两个使用TabPanel的项目。在每个项目中,我注意到不可见的选项卡上的组件仍然会调用其“getter”方法。

例如,第一个选项卡上有一个数据表,任何时候都可以从任何 其他 选项卡(包括ajax请求)发出请求绑定的bean在第一个选项卡上的数据表仍然有它的getter。

我认为会发生这种情况(即使该选项卡当前未在UI中呈现),因为该组件仍在组件层次结构中?换句话说,所有组件都是父选项卡面板的子组件,因此在每个请求中处理它们。即使它们不可见。

好的......如果我的假设是真的,那么我需要一种方法来 而不是 为未使用的标签调用数据检索逻辑。我已经阅读了关于延迟加载数据的帖子(没有将数据检索逻辑放在getter中),因为getter可能被多次调用。我正在尽力坚持这一点;我看到的问题是,即使我有一个绑定到表的bean(在选项卡一上),用请求范围定义,并且getter懒得加载表的数据,bean实例化,数据拉(懒惰),来自其他标签的每个ajax请求。

除了将所有内容从RichFace的TabPanel中拉出并滚动自己的内容之外,还有一种解决办法。

我尝试将bean绑定到表会话作用域并“缓存”getter返回到表的数据,但问题是没有生命周期方法可以在再次呈现选项卡时绑定(通过手动单击选项卡或以编程方式选择选项卡。

我很感激任何建议。

1 个答案:

答案 0 :(得分: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
        }
    }