根据 <h:outputText> 的值有条件地渲染 <div>

Conditionally render a <div> based on value of <h:outputText>

我正在使用 jsf primefaces。我想根据特定 outputext 的值显示图像。如果文本值为 'Alarm *',则 div 将出现在特定图像上。如果值为 'Alarm **',则会出现带有其他图像的 div,等等。我尝试了下面的代码,但它对我不起作用。

<h:outputText id="alarmCriticalityValue" value="#{msg[summary.criticality.key]}" />

<c:if test="#{alarmCriticalityValue=='Alarm *'}">
   <div class="alarm1"></div>
</c:if>

我应该如何实现这个想法?

您需要使用 binding 属性将 UIComponent 实例放入 EL 范围。 id 属性不会这样做,这与您的预期相反。

<h:outputText binding="#{alarmCriticality}" ... />

然后需要使用UIOutput#getValue()获取其value属性

<c:if test="#{alarmCriticality.value == 'Alarm *'}">

也就是说,您最好在此处使用 rendered 属性,特别是如果 #{summary} 表示 JSF 迭代组件的当前迭代项,例如 <ui:repeat><h:dataTable> .

<h:panelGroup layout="block" styleClass="alarm1"
    rendered="#{alarmCriticality.value == 'Alarm *'}" />

另请参阅:

  • How does the 'binding' attribute work in JSF? When and how should it be used?
  • How to conditionally render plain HTML elements like <div>s?
  • JSTL in JSF2 Facelets... makes sense?

与具体问题无关。看到条件渲染依赖于本地化文本很奇怪。如果更改语言环境 and/or 本地化文本怎么办?这是非常脆弱的。您最好检查捆绑密钥。

<h:outputText value="#{msg[summary.criticality.key]}" />
<h:panelGroup layout="block" styleClass="alarm1" 
    rendered="#{summary.criticality.key == 'some.alarm.key'}" />

这样你也不需要再绑定输出文本了。

尝试

<c:if test="#{msg[summary.criticality.key].equals('Alarm *')}">

或者在 h:outputText 中添加 binding 并进行检查。

试试这个

<h:outputText id="alarmCriticalityValue" value="#{msg[summary.criticality.key]}" />
    <h:panelGroup layout="block" styleClass="alarm1" rendered="#{alarmCriticality.value eq 'Alarm *'}" />