1

私の JSF ページでは、<c:choose><c:when>タグを使用してコンテンツを条件付きで表示しています。ただし、常に評価するように見えるため、機能しませんfalse

例えば

<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次の図で実際の出力を確認できます。

ここに画像の説明を入力

これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

2

症状とスクリーンショットは、 、、 、#{pollInfo}などの反復 UI コンポーネントの現在反復されている項目を が表していることを示唆しています。<ui:repeat><h:dataTable><p:tabView><p:dataTable>

JSTL タグは、ビューのビルド時、つまり JSF コンポーネント ツリーが XHTML ソース コードに基づいてビルドされる瞬間に実行されます。このvarような反復 UI コンポーネントの属性は、ビューのレンダリング時、つまり JSF コンポーネント ツリーに基づいて HTML 出力が生成される瞬間にのみ使用できます。

つまり、それらは「同期」して実行されません。は#{pollInfo}常にnullビューのビルド時です。

renderedこの特定のケースでは、代わりにJSF コンポーネントの属性が必要です。

<h:outputText value="Active" rendered="#{pollInfo.active}" />
<h:outputText value="Deactive" rendered="#{not pollInfo.active}" />

または、より大きなコードを条件付きでレンダリングする場合は、すべてを次のようにラップします<ui:fragment>

<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>

もう一度、純粋な if-else がある場合、EL で条件演算子を使用する別の方法があります。

<h:outputText value="#{pollInfo.active ? 'Active' : 'Deactive'}" />

追加のボーナスは、はるかに少ないコードで終わることです。

以下も参照してください。

于 2013-12-09T20:50:39.790 に答える