【问题标题】:JSF Composite component using a4j:repeat使用 a4j:repeat 的 JSF 复合组件
【发布时间】: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 吗?

【问题讨论】:

  • 那么它是否在复合之外工作?如果我没记错的话,你应该改用&lt;c:forEach&gt;
  • 嗯,当我像这样使用 c:forEach 时: 它甚至没有为 items 属性调用 getter.. .
  • 我并没有密切使用 RichFaces,但如果我没记错的话,使用 ui:repeat 生成 rich:menuItem 甚至在复合之外都无法工作。您应该为此使用c:forEach。但是在组合本身内部,当items 属性依赖于JSF 渲染时间属性(例如,从另一个父ui:repeath:dataTablevar 获得)时,c:forEach 反过来将不起作用。我认为标签文件对你来说更容易。
  • 对不起 BalusC,我犯了一个错误,在组件内部尝试 c:forEach 时出现空指针异常。然而,当我意识到它起作用时......虽然我还没有测试过在我的组件上使用 ajax 渲染属性。我还注意到,在使用 c:forEach 时,getter 被调用了 4 次……这是为什么呢?为什么我不能在复合材料中使用 a4j:repeat 或 ui:repeat ?无论如何,非常感谢 BalusC,你真的帮助了我。谢谢。

标签: jsf-2 richfaces composite-component


【解决方案1】:

只要我知道“动作”标签属性中使用的属性必须定义为复合接口中的方法;即在复合组件属性的定义中使用标签属性“方法签名”。

【讨论】:

    【解决方案2】:

    &lt;a4j:repeat&gt;&lt;ui:repeat&gt; 是在 JSF HTML 渲染时运行的 UI 组件。它的所有子组件将生成 HTML 多次,该组件需要迭代提供的集合。请注意,JSF 组件树中实际上只有一个组件。 &lt;c:forEach&gt; 是在 JSF 视图构建时运行的标记文件。 JSF 组件树最终将包含与标记需要迭代提供的集合一样多的重复子项。每个重复的孩子只生成一次 HTML。

    在您的初始方法中,您最终会得到&lt;rich:dropdownMenu&gt;,它只有一个&lt;a4j:repeat&gt; 类型的子代,而&lt;rich:menuItem&gt; 又只有一个子代&lt;rich:menuItem&gt;&lt;rich:dropdownMenu&gt; 不支持此功能。该组件仅支持多个 &lt;rich:menuItem&gt; 类型的子代。

    所以,将&lt;a4j:repeat&gt; 替换为&lt;c:forEach&gt;,它应该可以工作。

    您只需要确保它的值反过来不应该依赖于某些父级迭代 UI 组件的值,否则它会再次失败。在这种情况下,你真的需要一个标签文件而不是一个复合组件。

    另见:

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 2013-03-23
      • 2013-04-22
      • 2011-06-04
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2011-10-21
      • 2012-04-01
      相关资源
      最近更新 更多