我正在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:在复合组件内重复?非常感谢。
答案 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”。