34

ユーザーの情報の詳細をプレーンテキストで表示するか、現在接続しているユーザーの詳細が必要な場合は編集可能な入力テキストフィールドを介して表示する複合コンポーネントを実装しようとしています。

render 属性を介してすべての UI コンポーネントをレンダリングできることは知っていますが、UI コンポーネントではないもの(div など)についてはどうでしょうか。

<div class = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    Name: #{cc.attrs.value.name}
    Details: #{cc.attrs.value.details}
</div>

<div class = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <h:form>
        ...
    </h:form>
</div>

div に render 属性がないことはわかっていますが、おそらく正しいアプローチをまったく取っていません。JSTL タグは非常に簡単に使用できますが、それは避けたいと思います。

4

4 に答える 4

73

<div>HTML要素を表す適切な JSF コンポーネントは<h:panelGroup>layout属性が に設定されたblockです。したがって、これは次のようにする必要があります。

<h:panelGroup layout="block" ... rendered="#{someCondition}">
    ...
</h:panelGroup>

または、次のようにラップします<ui:fragment>

<ui:fragment rendered="#{someCondition}">
    <div>
        ...
    </div>
</ui:fragment>

または、すでに JSF 2.2+ を使用している場合は、パススルー要素にします:

<div jsf:rendered="#{someCondition}">

</div>

条件付きでレンダリングされたコンポーネントを ajax 更新する場合は、代わりにその親コン​​ポーネントを ajax 更新する必要があることに注意してください。

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

于 2012-01-11T13:02:50.787 に答える
11

これは、JSF 2.2 以降では簡単でした。pass-through 要素を使用することにより、任意の HTML 要素を、 render 属性を持つ JSF コンポーネントに変換できます。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf">
    <div class="userDetails" jsf:rendered="#{cc.attrs.value.id != sessionController.authUser.id}">
        Name: #{cc.attrs.value.name}
        Details: #{cc.attrs.value.details}
    </div>
</html>

https://jsflive.wordpress.com/2013/08/08/jsf22-html5/#elementsで詳細を読む

于 2016-04-02T02:47:21.440 に答える
8

HTMLを次のようにラップします<h:panelGroup>

<h:panelGroup rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    <div class = "userDetails">
        Name: #{cc.attrs.value.name}
        Details: #{cc.attrs.value.details}
    </div>
</h:panelGroup>

<h:panelGroup  rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <div class = "userDetails">
        <h:form>
           ...
        </h:form>
    </div>
</h:panelGroup>

もう1つのオプションは、プロジェクトに既にコンポーネントがある場合は、Seam(<s:div>)またはTomahawk(<t:htmlTag>)ライブラリのコンポーネントを使用することです。

参照:http ://www.jsftoolbox.com/documentation/seam/09-TagReference/seam-div.html

<s:div styleClass = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    Name: #{cc.attrs.value.name}
    Details: #{cc.attrs.value.details}
</s:div>

<s:div styleClass = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <h:form>
        ...
    </h:form>
</s:div>

または: http: //myfaces.apache.org/tomahawk-project/tomahawk12/tagdoc/t_htmlTag.html

<t:htmlTag value="div" styleClass = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
    Name: #{cc.attrs.value.name}
    Details: #{cc.attrs.value.details}
</t:htmlTag>

<t:htmlTag value="div" styleClass = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
    <h:form>
        ...
    </h:form>
</t:htmlTag>
于 2012-01-11T09:21:22.823 に答える