JSF Composite组件使用a4j:repeat

时间:2012-03-23 21:33:18

标签: jsf-2 richfaces composite-component

我正在JSF 2中创建一个复合组件...,在其中我定义了一个控制器属性,它应该指向一个处理组件背后逻辑的自定义对象。 基本上该组件有一个dropdownMenu,它是根据控制器提供的一些选项以dinamically方式创建的。

我试过这样的事情:

<composite:interface>
    <composite:attribute name="id" required="true" />
    <composite:attribute name="controller" required="true"/>
</composite:interface>

<composite:implementation>

    <a4j:outputPanel layout="block" id="pnlTaskOptions" style="width:300px;">

        <rich:dropDownMenu mode="ajax">
            <f:facet name="label">
               <h:panelGroup layout="block" styleClass="botonA" rendered="true">
                    <h:outputLink styleClass="solicitarAutorizacionA"
                        value="#{msg_autweb['etiqueta.aprobar']}"
                        immediate="true"/>
                </h:panelGroup>
            </f:facet>
            <a4j:repeat value="#{cc.attrs.controller.taskOptions}" var="option">
                <rich:menuItem  label="opcion"
                                action="#{cc.attrs.controller.executeOption(option)}"
                                render="pnlTaskOptions">
            </rich:menuItem>
            </a4j:repeat>
        </rich:dropDownMenu>

    </a4j:outputPanel>

</composite:implementation>

cc.attrs.controller.taskOptions是一个String arrayList,它填充在控制器的构造函数中。 我已经删除了它的getter,并检查了数组是否正确检索,换句话说检查它是否为空。

然而,菜单没有出现,就像没有儿童菜单项一样。 这是怎么回事?是不是可以使用a4j:在复合组件内重复?非常感谢。

2 个答案:

答案 0 :(得分:1)

<a4j:repeat><ui:repeat>是在JSF HTML渲染时运行的UI组件。它的所有子代将生成HTML多次,因为组件需要迭代所提供的集合。请注意,JSF组件树中只有一个组件。 <c:forEach>是一个在JSF视图构建时运行的标记文件。 JSF组件树将以标签需要迭代所提供的集合的多个重复子节点结束。每个重复的孩子只生成一次HTML。

在您的初始方法中,您最终得到<rich:dropdownMenu>,其中只有一个类型为<a4j:repeat>的子项,而这个子项只有一个<rich:menuItem>的子项。 <rich:dropdownMenu>不支持此功能。此组件仅支持多个<rich:menuItem>类型的子项。

因此,将<a4j:repeat>替换为<c:forEach>,它应该有效。

您只需要确保其值不依赖于某个父迭代UI组件的值,否则它将再次失败。在这种情况下,您确实需要一个标记文件而不是复合组件。

另见:

答案 1 :(得分:1)

只要我知道'action'中使用的属性,tag-attribute必须被定义为复合接口中的方法;即在复合组件属性的定义中使用tag-attribute“method-signature”。