即使渲染属性为false,组件仍然会以组件树结尾
Mojarra 2.1。即使渲染属性为false,组件仍然会以组件树结尾
我检查了类com.sun.faces.lifecycle.RestoreViewPhase
中的方法public void execute(FacesContext facesContext) throws FacesException
。现在,一旦通过调用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 />
实例将在树中。
所以,我的问题是如何处理Mojarra rendered
属性?该属性是否影响了唯一的渲染响应阶段?
在RestoreView
-Phase期间不使用呈现的属性。第一次评估是在ApplyRequestValue
-Phase。这是因为在RestoreView
-Phase期间没有应用“请求值”。因此可能无法评估可能依赖于这些值的属性rendered
。
都在那棵树上。尽管事实上#{bean.id}被评估为2,但它感到兴奋。我表明,唯一的实例将在树中。
JSF的组件树知道所有成分,如果没有他们渲染或没有关系的。这使您可以重新呈现某种成分与它的所有内部组件如果内(通常与复选框等使用) - 没有渲染的成分 - 将组件树内丢失的render="outerComponent"
使用将无法显示如果内部组件的rendered
-属性现在评估为真。
为了避免组件beeing添加到树的一切,你必须使用一个JSTL -Tag如<c:if >
- 如果这个计算结果为false,组件将不会被添加到组件树好,所以JSF会在不知道某个组件的情况下开始处理树。
您可能还需要阅读这篇文章,其中的差与实例解释和更多的细节: JSTL in JSF2 Facelets... makes sense?
另一个相关的问题:http://*.com/q/18768527 – BalusC