即使渲染属性为false,组件仍会在组件树中结束

时间:2015-08-28 07:50:22

标签: jsf jsf-2 rendered-attribute

Mojarra 2.1。

我检查了班级public void execute(FacesContext facesContext) throws FacesException中的方法com.sun.faces.lifecycle.RestoreViewPhase。现在,一旦视图由invokation viewRoot = viewHandler.restoreView(facesContext, viewId);恢复,我们就可以获得前一个请求中的complete树(如果它是一个回发)。

我检查了那棵树(手动迭代调试器中组件的children属性)并发现复合组件,声明如下:

<h:panelGroup rendered="#{bean.id == 1}">
    <utils:dropDownListFilterItem  />
</h:panelGroup>
<h:panelGroup rendered="#{bean.id == 2}">
    <utils:dateFilterItem />
 </h:panelGroup>
 <h:panelGroup rendered="#{bean.id == 3}">
    <utils:fieldFilterItem />
</h:panelGroup>

都在那棵树里。尽管#{bean.id}被评估为2,但它很高兴。我发现唯一的<utils:dateFilterItem />实例将在树中。

所以,我的问题是Mojarra如何处理rendered属性?属性是否会影响唯一的渲染响应阶段?

1 个答案:

答案 0 :(得分:7)

RestoreView - 阶段期间未使用呈现的属性。第一次评估是在ApplyRequestValue - 阶段。这是因为在RestoreView - 阶段期间没有应用请求值。因此,无法评估可能依赖于这些值的rendered - 属性。

  

都在那棵树里。尽管#{bean.id}被评估为2,但它很高兴。我发现唯一的实例将在树中。

JSF 的组件树知道所有组件,无论它们是否被渲染。这允许你重新渲染某个组件及其所有内部组件(通常与复选框一起使用等)。如果内部 - 尚未呈现的组件 - 在组件树中缺失,则使用{{ 1}}如果render="outerComponent" - 属性现在的计算结果为true,则无法显示内部组件。

为了避免将组件添加到该树中,您必须使用 JSTL -Tag,例如rendered - 如果此计算结果为false,则不会添加该组件到了组件树,所以JSF会在不知道某个组件的情况下开始处理树。

您可能还想阅读这篇文章,其中的差异通过示例和更详细的说明来解释: JSTL in JSF2 Facelets... makes sense?