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

但仅限于三个属性。如果我必须使用相同的复合组件发送三个以上,我该怎么办,如下所示:

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

我想这样做是为了重用组件,我不想创建另一个。

更新:Follow @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 原则

您最好的选择是它作为List<String>来自 bean 的 a 传递,以便您可以使用以下方法对其进行迭代<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为 ,renameSlider.xhtml以便您可以将其用作<cs:smallSlider>,这与所有正常的 JSF 组件非常一致。

于 2011-08-01T19:00:11.827 回答
0

BalusC 提到的解决方案的另一种替代方法是(ab)使用嵌套f:param标签。这也将允许将每个图像的附加参数传递给复合组件。以下示例中的 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 回答