1

複合コンポーネント内のアイテムのリストを繰り返し処理しています。リストの各項目を公開して、この複合コンポーネントの子コンポーネント内で使用できるようにし、リスト内のすべての項目を表示する方法のテンプレートを作成したいと考えています。

これが私の複合コンポーネントの実装です。

customList.xhtml

<ui:component
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:ui="http://java.sun.com/jsf/facelets">    

    <cc:interface>
    </cc:interface>

    <cc:implementation>       
        ...
        ...   
        <ui:repeat value="#{listRetriever.list}" var="item">
            <cc:insertChildren />
        </ui:repeat>

    </cc:implementation>
</ui:component>

#{item}今、自分のページで複合コンポーネントの子コンポーネントを定義する際に利用したいと思います(h:dataTableまたはに似ていますui:repeat)。

  <my:customList>
        #{item}                <!--- over here--->
  </my:customList>
4

2 に答える 2

2

ビューのレンダリング時ではなく、ビューのビルド時に評価されるため、<cc:insertChildren>内部では機能しません。はビュー レンダリング時にのみ実行されるため、ビュー レンダリング時にのみ使用できます。<ui:repeat><cc:insertChildren>#{item}<ui:repeat>

<c:forEach>それ自体のようにビューのビルド時にも評価されるため、代わりにJSTL を使用すると機能します<cc:insertChildren>

xmlns:c="http://java.sun.com/jsp/jstl/core"
...
<c:forEach items="#{listRetriever.list}" var="item">
    <cc:insertChildren />
</c:forEach>

別の繰り返し JSF コンポーネント内で複合を順番に使用する場合は注意してください。その場合は機能しません。JSF2 FaceletsのJSTLも参照してください...理にかなっていますか? .

UIDataまたはを拡張するカスタム コンポーネントを作成する以外に、代わりにUIRepeat使用する方法があり<ui:decorate>ます。

最初customList.xhtmlに通常のテンプレートを作成します。

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
>
    ... 
    ...  
    <ui:repeat value="#{list}" var="item">
        <ui:insert name="item" />
    </ui:repeat>
    ...
    ...
</ui:composition>

次に、次のように使用できます。

<ui:decorate template="customList.xhtml">
    <ui:param name="list" value="#{bean.list}" />
    <ui:define name="item">
        #{item}
    </ui:define>
</ui:decorate>
于 2012-06-17T14:24:34.717 に答える
1

最近、私は未解決の似たようなことをしようとしました。

私の解決策、私自身のコンポーネントの var 属性の値は、構成可能にすることはできません。したがって、「var」という名前で固定し、常にコンポーネントに公開し、変数「var」を使用します。

mi コードの例:

コンポーネント: file:listadoPaginado.xhtml

<composite:interface>
    <composite:attribute name="id" required="true" 
                         displayName="ID if component" 
                         shortDescription="ID of component" />
    <composite:attribute name="value" required="true" 
                         displayName="List with values to iterate"/>  
</composite:interface>

<!-- Implementacion de la estructura del componente -->
<composite:implementation>
    <h:panelGroup id="#{cc.attrs.id}_panel_comp">
        <br/>
        <div  style="#{cc.attrs.style}">

            <ui:repeat  var="var" value="#{cc.attrs.value.model}">
                <composite:insertChildren/>
            </ui:repeat>
        </div>
    </h:panelGroup>
</composite:implementation>

コンポーネントの使用:

<gb:listadoPaginado id="listado_garantias"
                            value="#{beanTest.myList}">
 <p:panel>
     <p:panelGrid>
         <p:row>
              <p:column>
                   <h:outputLabel value="#{var.description}"/>
               </p:column>
               <p:column>
                    <p:inputText value="#{var.longDescription}"/>
                </p:column>
          </p:row>
       </p:panelGrid>
   </p:panel>

于 2012-06-19T19:58:38.767 に答える