我在rendered="false"后面隐藏了一个组件。组件仍然会被初始化并启动一些资源浪费过程。如何确保组件在其区域/组件/面板具有rendered="false"时不被初始化
源代码:
XHTML
<a4j:region rendered="false">
<h:panelGroup rendered="false">
<rich:dropDownMenu binding="#{textBlockBean.textBlockMenu}" rendered="false" />
</h:panelGroup>
</a4j:region>JAVA
public UIComponent getTextBlockMenu() {
if (textblockMenu == null) {
textblockMenu = createTextBlok();
}
textblockMenuComponent = textblockMenu.build();
return textblockMenuComponent;
}我怎样才能防止
<rich:dropDownMenu binding="#{textBlockBean.textBlockMenu}"/>在需要之前被触发。
提前感谢!
发布于 2014-04-07 21:11:56
问题
到EL处理器到达该标记时,决定不构建标记所绑定的UIComponent实例已经为时已晚,也就是说,一旦EL处理器到达<rich:dropDownMenu/>,就会调用getTextBlockMenu()。rendered属性是一个视图呈现时间标志,它简单地决定是否显示组件。
解决问题
是否构建组件的决定必须在使用<c:if/> JSTL标记进行视图构建时做出:
<a4j:region rendered="false">
<h:panelGroup rendered="false">
<c:if test="#{textBlockBean.renderCondition}">
<rich:dropDownMenu binding="#{textBlockBean.textBlockMenu}" rendered="false" />
</c:if>
</h:panelGroup>
</a4j:region>其中,renderCondition是确定组件可用性的后台bean标志。
发布于 2014-04-07 21:11:16
由于呈现的-属性可能不是静态的,而是一个EL-expr,所以您也可以在getter-方法中使用该EL来防止调用init。
此外,在调用过程中多次调用getter:
Why JSF calls getters multiple times
因此,最好是重新安排编码逻辑,将init代码从getter方法中移出。
https://stackoverflow.com/questions/22911012
复制相似问题