2

私はこの複合コンポーネントを持っています:

<cc:interface>
    <cc:attribute name="image_1" />
    <cc:attribute name="image_2" />
    <cc:attribute name="image_3" />
</cc:interface>

<cc:implementation>
    <div id="slider-container">
        <div id="slider-small">
            <h:graphicImage library="images" name="#{cc.attrs.image_1}" />
            <h:graphicImage library="images" name="#{cc.attrs.image_2}" />
            <h:graphicImage library="images" name="#{cc.attrs.image_3}" />
        </div>
    </div>
</cc:implementation>

私はこのように使用します:

<cs:small_slider 
    image_1="about/1.jpg"
    image_2="about/2.jpg"
    image_3="about/3.jpg"
/>

ただし、属性は 3 つに制限されています。次のように、同じ複合コンポーネントを使用して 3 つ以上送信する必要がある場合はどうすればよいですか。

<cs:small_slider 
    image_1="about/1.jpg"
    image_2="about/2.jpg"
    image_3="about/3.jpg"
    image_4="about/4.jpg"
    image_5="about/5.jpg"
/>

コンポーネントを再利用するためにこれを行いたいのですが、別のコンポーネントを作成したくありません。

UPDATE : @BalusC アプローチに従うと、次の HTML がレンダリングされます。

<!-- small slider --> 
<div id="slider-container"> 
    <div id="slider-small">
        <img src="/brainset/javax.faces.resource/1.jpg.xhtml?ln=images" />
        <img src="RES_NOT_FOUND" />
        <img src="RES_NOT_FOUND" /> 
    </div> 
    <div id="frame-slider-small"></div> 
</div><!-- end #slide-container --> 

他の画像は見つかりませんでした。最初の画像だけです。「about/2.jpg」と「about/3.jpg」という画像が存在すると確信しています。

4

2 に答える 2

3

それは不可能であり、DRY の原則にも違反しています。

あなたの最善の策は、代わりにBeanからとして渡すことですList<String>。これにより、次を使用して反復処理できます<ui:repeat>

<cs:small_slider images="#{bean.images}" />

<cc:interface>
    <cc:attribute name="images" type="java.util.List" required="true" />
</cc:interface>

<cc:implementation>
    <div id="slider-container">
        <div id="slider-small">
            <ui:repeat value="#{cc.attrs.images}" var="image">
                <h:graphicImage library="images" name="#{image}" />
            </ui:repeat>
        </div>
    </div>
</cc:implementation>

または、代わりにハードコードされたカンマ区切りの文字列として定義し、JSTLfn:split()を使用してそれらを に分割しString[]、次にフィードし<ui:repeat>ます。

<cs:small_slider images="about/1.jpg,about/2.jpg,about/3.jpg" />

<cc:interface>
    <cc:attribute name="images" type="java.lang.String" required="true" />
</cc:interface>

<cc:implementation>
    <div id="slider-container">
        <div id="slider-small">
            <ui:repeat value="#{fn:split(cc.attrs.images, ',')}" var="image">
                <h:graphicImage library="images" name="#{image}" />
            </ui:repeat>
        </div>
    </div>
</cc:implementation>

具体的な問題とは関係ありませんが、Java/JSF の命名規則と一致するようにしてください。として使用できるように、名前をsmall_slider.xhtmlに変更します。これは、すべての通常の JSF コンポーネントとうまく一致しています。renameSlider.xhtml<cs:smallSlider>

于 2011-08-01T19:00:11.827 に答える
0

BalusC が言及したソリューションの別の代替案は、ネストされたf:paramタグを (ab) 使用することです。これにより、画像ごとに追加のパラメーターを複合コンポーネントに渡すこともできます。次の例の name 属性はオプションです。

<cs:slider>
    <f:param name="image1" value="image1"/>
    <f:param name="image2" value="image2"/>
    <f:param name="image3" value="image3"/>
</cs:slider>

次のように定義された複合コンポーネントを使用します。

<cc:interface>
</cc:interface>

<cc:implementation>
    <div id="slider-container">
        <div id="slider-small">
            <c:forEach items="#{cc.children}" var="param">
                <h:graphicImage library="images" name="#{param.value}" title="#{param.name}"/>
            </c:forEach>
        </div>
    </div>
</cc:implementation>

元の問題はすでに解決されているため、このアプローチに関するフィードバックを得るために、これをさらに書いています。

于 2011-08-01T20:36:09.427 に答える