ADF 11 R1中PanelBox的disclosed属性失效问题求助
解决ADF 11 R1中PanelBox登录后状态异常的问题
看起来你遇到的问题是MDS(Metadata Services)在搞鬼——ADF默认会持久化用户对组件的交互状态,包括af:panelBox的展开/折叠状态,这就导致你设置的disclosed="false"会被之前用户操作的状态覆盖,重新登录后恢复之前的状态。下面是几个针对性的解决方案:
方法1:直接禁用单个PanelBox的状态持久化
这是最直接的方式,给你的af:panelBox添加persist="false"属性,告诉MDS不要保存这个组件的状态,每次页面加载都会使用你设置的默认值disclosed="false"。修改后的代码如下:
<af:panelBox text="#{row.date} - #{row.name}" id="pb1" styleClass="AFStretchWidth" disclosed="false" type="flow" persist="false">
方法2:全局配置排除指定组件的状态持久化
如果你有多个panelBox需要处理,或者想统一配置,可以修改项目中的trinidad-config.xml文件:
- 打开
WEB-INF/trinidad-config.xml - 添加以下配置来排除特定组件的持久化(这里以你的
pb1为例,多个组件用逗号分隔):
<trinidad-config> <!-- 其他已有配置 --> <property name="exclude-persistent-ids">pb1</property> </trinidad-config>
如果想彻底关闭所有组件的状态持久化,可以替换持久化管理器为内存版(重启后状态丢失):
<trinidad-config> <property name="persistent-change-manager"> org.apache.myfaces.trinidad.change.MemoryChangeManager </property> </trinidad-config>
方法3:通过后台Bean强制重置状态
如果上面的方法不适用,你可以在页面加载时,通过后台Bean强制将所有panelBox设置为关闭状态:
- 在页面中添加
preRenderView事件监听:
<f:event listener="#{yourBean.resetPanelBoxDisclosedState}" type="preRenderView"/>
- 在对应的Managed Bean中实现重置方法:
import oracle.adf.view.rich.component.rich.nav.RichPanelBox; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.event.ComponentSystemEvent; import java.util.ArrayList; import java.util.List; public class YourBean { public void resetPanelBoxDisclosedState(ComponentSystemEvent event) { UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); // 递归查找所有PanelBox组件 List<UIComponent> panelBoxes = findComponentsByType(viewRoot, RichPanelBox.class); for (UIComponent comp : panelBoxes) { RichPanelBox panelBox = (RichPanelBox) comp; panelBox.setDisclosed(false); } } private List<UIComponent> findComponentsByType(UIComponent parent, Class<?> targetClass) { List<UIComponent> result = new ArrayList<>(); if (targetClass.isInstance(parent)) { result.add(parent); } for (UIComponent child : parent.getChildren()) { result.addAll(findComponentsByType(child, targetClass)); } return result; } }
这三种方法都能确保每次进入页面或登录应用时,panelBox都处于关闭状态,你可以根据自己的场景选择最适合的方式。
内容的提问来源于stack exchange,提问作者LeCram
相关产品推荐
相关产品推荐

