【问题标题】:JSF/RichFaces 4 issue: initiating component while rendering is falseJSF/RichFaces 4 问题:渲染时启动组件是错误的
【发布时间】:2014-05-19 14:42:49
【问题描述】:

我有一个隐藏在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}"/>

在需要之前被触发。

提前致谢!

【问题讨论】:

    标签: java jsf-2 richfaces rendering


    【解决方案1】:

    问题

    当 EL 处理器到达该标签时,决定构建标签绑定到的 UIComponent 实例已经太迟了,即一旦 EL 处理器到达 @ 987654322@,它会打电话给getTextBlockMenu()rendered 属性是一个视图渲染时间标志,它简单地决定是否显示组件。

    解决

    必须在 view-build 期间使用&lt;c:if/&gt; 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 标志

    【讨论】:

      【解决方案2】:

      因为渲染属性可能不是静态的,而是一个 EL-expr, 您也可以在 getter 方法中使用该 EL,以防止调用 init。

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

      Why JSF calls getters multiple times

      因此,重新排列您的编码逻辑,将 init-code 从 getter 方法中移出可能会更好。

      【讨论】:

      • 虽然不是我问题的答案,但还是一些不错的信息
      猜你喜欢
      • 2011-12-23
      • 2011-07-12
      • 1970-01-01
      • 2011-08-24
      • 2011-11-26
      • 1970-01-01
      • 2011-09-28
      • 2011-04-13
      • 1970-01-01
      相关资源
      最近更新 更多