1

莫哈拉 2.1。

我检查了public void execute(FacesContext facesContext) throws FacesException类中的方法com.sun.faces.lifecycle.RestoreViewPhase。现在,一旦视图通过调用恢复, viewRoot = viewHandler.restoreView(facesContext, viewId);我们就有了来自上一个请求的完整树(如果它是回发)。

我检查了那棵树(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 />实例会在树中。

那么,我的问题是renderedMojarra 如何处理该属性?属性是否影响唯一的渲染响应阶段?

4

1 回答 1

7

RestoreView在-Phase期间不使用渲染属性。第一次评估是在ApplyRequestValue- 阶段。这是因为在 - 阶段期间RestoreView没有应用请求值。因此,rendered无法评估可能取决于这些值的 - 属性。

都在那棵树上。尽管 #{bean.id} 被评估为 2,但它还是发生了。我预计唯一的实例会在树中。

JSF的组件树知道所有组件,无论它们是否被渲染。这允许您重新渲染某个组件及其所有内部组件(通常与复选框等一起使用)。如果内部 - 尚未渲染的组件 - 在组件树中丢失,则使用render="outerComponent"将无法显示内部组件如果他们的rendered-attribute 现在评估为 true。

为了完全避免将组件添加到该树中,您必须使用JSTL -Tag,例如<c:if >- 如果评估结果为 false,则根本不会将组件添加到组件树中,因此 JSF 将开始处理树而不了解某个组件。

您可能还想阅读这篇文章,其中通过示例和更多详细信息解释了不同之处: JSF2 Facelets 中的 JSTL ... 有意义吗?

于 2015-08-28T08:34:55.147 回答