首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF/RichFaces 4问题:呈现时启动组件是假的

JSF/RichFaces 4问题:呈现时启动组件是假的
EN

Stack Overflow用户
提问于 2014-04-07 11:24:13
回答 2查看 157关注 0票数 0

我在rendered="false"后面隐藏了一个组件。组件仍然会被初始化并启动一些资源浪费过程。如何确保组件在其区域/组件/面板具有rendered="false"时不被初始化

源代码:

XHTML

代码语言:javascript
复制
<a4j:region rendered="false">
  <h:panelGroup rendered="false"> 
    <rich:dropDownMenu binding="#{textBlockBean.textBlockMenu}" rendered="false" />
  </h:panelGroup>
</a4j:region>

JAVA

代码语言:javascript
复制
public UIComponent getTextBlockMenu() {
  if (textblockMenu == null) {
    textblockMenu = createTextBlok();
  }
  textblockMenuComponent = textblockMenu.build();
  return textblockMenuComponent;
}

我怎样才能防止

代码语言:javascript
复制
<rich:dropDownMenu binding="#{textBlockBean.textBlockMenu}"/>

在需要之前被触发。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-07 21:11:56

问题

到EL处理器到达该标记时,决定不构建标记所绑定的UIComponent实例已经为时已晚,也就是说,一旦EL处理器到达<rich:dropDownMenu/>,就会调用getTextBlockMenu()rendered属性是一个视图呈现时间标志,它简单地决定是否显示组件。

解决问题

是否构建组件的决定必须在使用<c:if/> JSTL标记进行视图构建时做出:

代码语言:javascript
复制
<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标志。

票数 2
EN

Stack Overflow用户

发布于 2014-04-07 21:11:16

由于呈现的-属性可能不是静态的,而是一个EL-expr,所以您也可以在getter-方法中使用该EL来防止调用init。

此外,在调用过程中多次调用getter:

Why JSF calls getters multiple times

因此,最好是重新安排编码逻辑,将init代码从getter方法中移出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22911012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档