我对RichFace(3.3.3)TabPanel有疑问。我参与了两个使用TabPanel的项目。在每个项目中,我注意到不可见的选项卡上的组件仍然会调用其“getter”方法。
例如,第一个选项卡上有一个数据表,任何时候都可以从任何 其他 选项卡(包括ajax请求)发出请求绑定的bean在第一个选项卡上的数据表仍然有它的getter。
我认为会发生这种情况(即使该选项卡当前未在UI中呈现),因为该组件仍在组件层次结构中?换句话说,所有组件都是父选项卡面板的子组件,因此在每个请求中处理它们。即使它们不可见。
好的......如果我的假设是真的,那么我需要一种方法来 而不是 为未使用的标签调用数据检索逻辑。我已经阅读了关于延迟加载数据的帖子(没有将数据检索逻辑放在getter中),因为getter可能被多次调用。我正在尽力坚持这一点;我看到的问题是,即使我有一个绑定到表的bean(在选项卡一上),用请求范围定义,并且getter懒得加载表的数据,bean实例化,数据拉(懒惰),来自其他标签的每个ajax请求。
除了将所有内容从RichFace的TabPanel中拉出并滚动自己的内容之外,还有一种解决办法。
我尝试将bean绑定到表会话作用域并“缓存”getter返回到表的数据,但问题是没有生命周期方法可以在再次呈现选项卡时绑定(通过手动单击选项卡或以编程方式选择选项卡。
我很感激任何建议。
答案 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
}
}