【发布时间】:2012-04-08 10:59:16
【问题描述】:
我正在 JSF 2 中创建一个复合组件...,在其中我定义了一个控制器属性,该属性应该指向一个自定义对象,该对象处理组件背后的逻辑。
基本上,该组件有一个 dropdownMenu,它是根据控制器提供的一些选项动态创建的。
我尝试过这样的事情:
<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 是一个字符串数组列表,填充在控制器的构造函数中。
我已经调试了它的 getter,并检查了数组是否被正确检索,换句话说,检查它是否为空。
但是菜单没有出现,就像没有子菜单项一样。 这是怎么回事?不能在复合组件中使用 a4j:repeat 吗?
【问题讨论】:
-
那么它是否在复合之外工作?如果我没记错的话,你应该改用
<c:forEach>。 -
嗯,当我像这样使用 c:forEach 时:
它甚至没有为 items 属性调用 getter.. . -
我并没有密切使用 RichFaces,但如果我没记错的话,使用
ui:repeat生成rich:menuItem甚至在复合之外都无法工作。您应该为此使用c:forEach。但是在组合本身内部,当items属性依赖于JSF 渲染时间属性(例如,从另一个父ui:repeat或h:dataTable的var获得)时,c:forEach反过来将不起作用。我认为标签文件对你来说更容易。 -
对不起 BalusC,我犯了一个错误,在组件内部尝试 c:forEach 时出现空指针异常。然而,当我意识到它起作用时......虽然我还没有测试过在我的组件上使用 ajax 渲染属性。我还注意到,在使用 c:forEach 时,getter 被调用了 4 次……这是为什么呢?为什么我不能在复合材料中使用 a4j:repeat 或 ui:repeat ?无论如何,非常感谢 BalusC,你真的帮助了我。谢谢。
标签: jsf-2 richfaces composite-component