【问题标题】:dynamic panelMenu in richfacesRichfaces 中的动态面板菜单
【发布时间】:2018-06-19 10:23:39
【问题描述】:

我正在尝试使用我已经拥有的项目列表动态创建panelMenu。 但这似乎不起作用,因为我没有得到任何结果。 所以这是我的代码:

<rich:panelMenu id="filterListFuncPost" style="width:180px"
    itemMode="ajax" groupMode="ajax"
    groupExpandedLeftIcon="triangleUp"
    groupCollapsedLeftIcon="triangleDown"
    topGroupExpandedRightIcon="chevronUp"
    topGroupCollapsedRightIcon="chevronDown" itemLeftIcon="disc">
        <rich:panelMenuGroup label="Functional Positions">
            <c:forEach xmlns:c="http://java.sun.com/jstl/core" var="item"
                items="#{reportsBacking.selectedFunctPosIndex}">
                    <rich:panelMenuItem label="#{item}" />
            </c:forEach>
        </rich:panelMenuGroup>

</rich:panelMenu>

【问题讨论】:

  • 您检查过生成的 HTML 吗?它看起来像什么?

标签: dynamic richfaces jpanelmenu


【解决方案1】:

它可能对谁有帮助,我找到了一种让它工作的方法,即使用rich:list 而不是c:forEach,它工作正常。

【讨论】:

  • c:forEach 是一个标签处理程序,它在视图构建期间运行,因此可能为时过早,无法访问reportsBacking 的内容。 rich:List 是一个 ui 组件,操作 after 视图构建,及时访问正确的变量。结果,您可以在这里轻松地将ui:repeat 替换为rich:List
  • 我可能会尝试使用 Rich:List 的方法。谢谢!使用 ui:repeat 不起作用 - 请参阅下面的替代答案。
【解决方案2】:

更新:适用于 RichFaces panelMenu,但前提是您使用了正确的迭代器。我以全新的眼光回到这个问题并找到了一个相当明显的解决方案,但它似乎还没有出现在互联网上,所以它是:

xmlns:c="http://java.sun.com/jstl/core"
xmlns:rich="http://richfaces.org/rich"

<rich:panelMenu id="menuRoot">
    <rich:panelMenuGroup id="lev1menu">
        <c:forEach var="fancyGroup" items="#{myBean.myFancyGroupEntity}">
            <rich:panelMenuGroup label="#{fancyGroup.name}" id="lev2menu_#{fancyGroup.id}">
                <c:forEach var="fancyItem" items="#{fancyGroup.items}">
                    <rich:panelMenuItem label="#{fancyItem.name}" action="#{myBean.viewItem}">
                        <a4j:actionParam name="itemId" value="#{fancyItem.id}"/>
                    </rich:panelMenuItem>
                </c:forEach>
            </rich:panelMenuGroup>
        </c:forEach>
    </rich:panelMenuGroup>
</rich:panelMenu>

为什么有效?因为 JSTL 核心组件在 JSF 组件(或类似的东西)之前被解析和处理,因此 c:forEach 在 JSF 被解析和处理之前呈现出所有 RichFaces(或其他 JSF)子组件。因此,panelMenu 在解析时具有正确类型的子项。

旧:无法与 RichFaces panelMenu (org.richfaces.component.UIPanelMenu) 组件一起使用。

我尝试了一种类似的方法,使用数据库项来动态生成菜单层次结构,但是当它尝试在服务器端解析它时,RichFaces 尝试将任何子项转换为 panelMenuGroup 或 panelMenuItem 并使用ClassCastException 尝试从com.sun.facelets.component.UIRepeat 转换,这对于您的JSTL forEach 迭代组件(我认为这是服务器上org.apache.taglibs.standard.tag.rt.core.ForEachTag 的一个实例)是相同的。

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2017-03-17
    • 2012-04-02
    • 2014-09-09
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多