Динамически генерировать богатые элементы меню внутри богатого контекстного меню
Я пытаюсь динамически генерировать богатые пункты меню внутри компонента контекстного меню. Вот мой код:
<ui:repeat var="group" value="#{myBean.groups}" >
<div align="center">
<rich:panel>
<h:graphicImage value="#{group.iconUrl}"/>
<rich:contextMenu attached="true">
<c:forEach var="child" items="#{group.children}">
<rich:menuItem label="#{child.name}" />
</c:forEach>
</rich:contextMenu>
</rich:panel>
</div>
</ui:repeat>
Я использую эту библиотеку тегов:
xmlns:c="http://java.sun.com/jsp/jstl/core
Моя проблема в том, что пункты меню не генерируются. Я также попытался заменить c:forEach на ui:repeat, но он все равно не будет работать.
Я попытался немного поэкспериментировать, чтобы устранить некоторые факторы. Я удалил богатое контекстное меню и использовал пользовательский интерфейс: repeat
<ui:repeat var="group" value="#{myBean.groups}" >
<div align="center">
<rich:panel>
<h:graphicImage value="#{group.iconUrl}"/>
<ui:repeat var="child" value="#{group.children}">
<h:outputText value="#{child.name}" />
</ui:repeat>
</rich:panel>
</div>
</ui:repeat>
Этот фрагмент кода выше работал. Я предполагаю, что есть конфликт с рендерингом контекстного меню и повторением пользовательского интерфейса.
К сожалению, мне действительно нужно поместить group.children в компонент богатого контекстного меню. Можете ли вы предложить какой-либо подход, который поможет мне достичь того, чего я хочу?
ПРИМЕЧАНИЕ: я использую сервлет версии 3.0
1 ответ
<c:forEach>
выполняется во время построения представления, когда файл XHTML должен быть преобразован в дерево компонентов JSF. <ui:repeat>
выполняется во время визуализации представления, когда дерево компонентов JSF собирается произвести HTML.
Итак, в вашем конкретном примере, на данный момент <c:forEach>
работает, #{group}
переменная, как определено <ui:repeat>
нигде не доступен в области EL и <c:forEach>
в основном восстанавливает null
как значение элементов и, следовательно, не имеет итерации.
Ваша конструкция будет работать только если вы замените внешнюю <ui:repeat>
от <c:forEach>
также.