在我的JSF页面中,我使用<c:choose><c:when>
标签来有条件地显示内容。但是,它似乎无法正常评估false
。
E.g。
<h:outputText value="#{pollInfo.active} -" />
<c:choose>
<c:when test="#{pollInfo.active}">
<h:outputText value="Active" />
</c:when>
<c:otherwise>
<h:outputText value="Deactive" />
</c:otherwise>
</c:choose>
肯定会有一些active=true
项目由<h:outputText>
确认,但它只会为所有项目打印Deactive
。您可以在下图中看到实际输出:
这是如何引起的?如何解决?
答案 0 :(得分:2)
症状和屏幕截图表明#{pollInfo}
表示迭代UI组件的当前迭代项,例如<ui:repeat>
,<h:dataTable>
,<p:tabView>
,{{1}等等。
JSTL标记在视图构建时运行,即基于XHTML源代码构建JSF组件树的那一刻。这种迭代UI组件的<p:dataTable>
属性仅在视图渲染时,即基于JSF组件树生成HTML输出的那一刻可用。
换句话说,它们不会“同步”运行。在视图构建期间,var
始终为#{pollInfo}
。
在这种特殊情况下,您需要JSF组件的null
属性。
rendered
或者,如果您打算有条件地渲染更大的代码片段,请将所有内容包装在<h:outputText value="Active" rendered="#{pollInfo.active}" />
<h:outputText value="Deactive" rendered="#{not pollInfo.active}" />
中:
<ui:fragment>
再次另一种选择,假设你有一个纯粹的if-else,在EL中使用条件运算符:
<ui:fragment rendered="#{pollInfo.active}">
<h:outputText value="Active" />
<!-- Some more components here if necessary. -->
</ui:fragment>
<ui:fragment rendered="#{not pollInfo.active}">
<h:outputText value="Deactive" />
<!-- Some more components here if necessary. -->
</ui:fragment>
额外的奖励是,你最终会得到更少的代码。