Компонент JSF с использованием a4j: repeat - PullRequest
0 голосов
/ 24 марта 2012

Я создаю составной компонент в 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 - это String arrayList, который заполняется внутри конструктора контроллера. Я отладил его получатели и проверил, что массив был получен правильно, другими словами, проверил, что он не пустой.

Однако меню не появилось, как если бы не было дочерних пунктов меню. В чем дело? Не возможно использовать a4j: повторить внутри составного компонента ?? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Пока я знаю, что атрибут, используемый в теге-атрибуте 'action', должен быть определен как метод в составном интерфейсе;то есть используя атрибут tag 'method-signature' в определении атрибута составного компонента.

1 голос
/ 26 марта 2012

<a4j:repeat> и <ui:repeat> - это компоненты пользовательского интерфейса, которые работают во время рендеринга JSF HTML. Все его дочерние элементы будут генерировать HTML в несколько раз больше, чем необходимо компоненту для итерации по предоставленной коллекции. Обратите внимание, что физически в дереве компонентов JSF есть только один компонент. <c:forEach> - это файл тегов, который выполняется во время сборки представления JSF. Дерево компонентов JSF будет иметь столько дублированных дочерних элементов, сколько потребуется тегу для перебора предоставленной коллекции. Каждый из этих дублированных потомков генерирует HTML только один раз.

В вашем первоначальном подходе вы получите <rich:dropdownMenu>, у которого есть только один дочерний элемент типа <a4j:repeat>, у которого, в свою очередь, есть только один дочерний элемент <rich:menuItem>. Это не поддерживается <rich:dropdownMenu>. Этот компонент поддерживает только несколько дочерних элементов типа <rich:menuItem>.

Итак, замените <a4j:repeat> на <c:forEach>, и оно должно работать.

Вам нужно только убедиться, что его значение, в свою очередь, не должно зависеть от значения некоторого родительского итеративного компонента пользовательского интерфейса, иначе оно снова не будет выполнено. В таком случае вам действительно нужен файл тегов вместо составного компонента.

Смотри также:

...