Динамическая панель Menu в richfaces
Я пытаюсь создать 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>
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 отрисовывает все дочерние компоненты RichFaces (или другие JSF) до того, как 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
на сервере, я думаю).
Для кого это может помочь, я нашел способ заставить его работать, который заключается в использовании rich:list
вместо c:forEach
и работает нормально.