是否有一种优雅的方式来处理渲染检查,类似于if else块

时间:2010-08-10 03:46:17

标签: jsf seam

在下面的场景中,“hasA”条件被检查两次,有没有办法模仿这个类似于if / else的块,这样条件只被评估一次

            <s:decorate template="/layout/display.xhtml">
                <h:outputText value="Print A." rendered="#{hasA}"/>
                <h:outputText value="Print B." rendered="#{!hasA}"/>
            </s:decorate>

2 个答案:

答案 0 :(得分:6)

您可以使用EL表达式

在value属性中编写条件
 <h:outputText value="#{hasA ? 'Print A.' : 'Print B.'}" />

答案 1 :(得分:1)

为了避免这个问题,你可以确保getter不会做任何复杂的东西两次或基本上返回一个布尔值。你还应该确保getter是indempotent:调用它两次应该产生相同的结果。为此,你可以

  1. 懒惰地计算布尔值并将其存储在临时字段中,以便第二次返回预先计算的值。
  2. 更改逻辑,以便导致更改布尔值的操作实际上更新布尔字段,而getter / setter实际上只是一个getter / setter并且不会计算任何内容。
  3. 解释不是很清楚,但你应该看到这个想法。我没有看到多次评估简单的getter有什么问题。