是否可以有一个具有 ui:repeat 的 JSF 组件,并且在重复中调用相同的组件?这是因为我正在构建问题树:
<cc:interface>
<cc:attribute name="questions" required="true" />
<cc:attribute name="renderQuestions" required="true" default="true" />
</cc:interface>
<cc:implementation>
<c:if test="#{cc.attrs.renderQuestions}">
<ui:repeat value="#{cc.attrs.questions}" var="q">
<p:panelGrid columns="2">
<h:outputLabel value="#{q.question}"></h:outputLabel>
<p:selectBooleanButton onLabel="#{messages['commons.yes']}"
offLabel="#{messages['commons.no']}" onIcon="ui-icon-check"
offIcon="ui-icon-close" value="#{q.ok}">
<p:ajax update="@all"></p:ajax>
</p:selectBooleanButton>
</p:panelGrid>
<cf:question renderQuestions="#{q.ok}" questions="#{q.children}" />
</ui:repeat>
</c:if>
</cc:implementation>
目前我遇到了 stackoverflow?
使用视图构建时间标记而不是视图渲染时间标记来停止递归。组件树是在视图构建期间构建的。这rendered
属性不会在视图构建时评估,而是在视图渲染时评估。所以你的构造基本上保持将自身包含在无限循环中。你应该已经知道了StackOverflowError
是由深度递归导致内存堆栈无法再处理的(通常大约 1000 次迭代)。
Replace <h:panelGroup rendered>
by a <c:if test>
它会按预期工作。这renderQuestions
顺便说一句,可以通过省略对儿童的检查来简化。这<ui:repeat>
如果没有孩子,无论如何都不会渲染任何东西。
如果您碰巧在此构造中使用视图作用域 bean 并且正在使用 Mojarra 实现,那么请确保您至少升级到 2.1.18,因为在旧版本中将视图构建时间标记属性绑定到视图作用域 bean 属性打破视图范围。
也可以看看:
-
JSF2 Facelets 中的 JSTL...有意义吗?- 解释“视图构建时间”与“视图渲染时间”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)