Динамический интерфейс: включить внутри интерфейса: повторить.Есть ли простое решение? - PullRequest
6 голосов
/ 29 июля 2010

Я хочу динамически выбрать фасетку, чтобы отобразить какой-либо элемент в моем списке данных. Первая попытка будет:

<ui:repeat value="#{panels}" var="panel">
  <ui:include src="#{panel.facelet}">
</ui:repeat>

Но это не сработает, поскольку src of ui: include оценивается слишком рано. Информация о Facelet действительно динамична, поэтому я не могу использовать c: forEach (не рекомендуется смешивать с Facelet). Я думаю, все сводится к поиску компонента на основе пользовательского интерфейса: включить альтернативу.

Есть такая вещь или мне нужно написать свою?

Ответы [ 3 ]

4 голосов
/ 24 июня 2015

Мне кажется, я нашел это относительно простое решение, которое вы искали.

Я тоже начал с пользовательского интерфейса: включите в пользовательский интерфейс: повторите, как у вас, но яЯ согласился с тем, что мне пришлось использовать ac: forEach, а c: forEach отлично работал для динамического получения другого набора xhtml / компонентов, чтобы он мог даже при взаимодействии с пользователем изменять вещи в представлении, как я думаю, у вас.Выглядело это так:

<c:forEach var="thing" items="#{view.things}">
        <ui:include src="#{thing.renderComponent}">
            <ui:param name="thing" value="#{thing}"/>
        </ui:include>
</c:forEach>

Однако мой пользовательский интерфейс: param не работал - каждому включенному компоненту передавалась одна и та же «вещь» / объект, даже если мы успешно использовали разные вещи / объекты для динамическоговключают в себя различные компоненты.

Именно тогда я нашел эту запись, которая вдохновила меня на то, чтобы обернуть мой пользовательский интерфейс: include в af: subview.И теперь все прекрасно работает со следующим кодом:

<c:forEach var="thing" items="#{view.things}" varStatus="loop">
    <f:subview id="thing_#{loop.index}">
        <ui:include src="#{thing.renderComponent}">
            <ui:param name="thing" value="#{thing}"/>
        </ui:include>
    </f:subview>
</c:forEach>
2 голосов
/ 29 июля 2010

c: forEach решит это, почему вы не можете его использовать?

Интересная статья по этому вопросу: http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets

0 голосов
/ 29 июля 2010

Я помню, как пытался сделать что-то подобное, используя пользовательский тег, FaceletHandler и т. Д. В конце концов, все мелкие проблемы со временем рендеринга сделали его не стоящим усилий.Имейте в виду, что я ( и до сих пор: - (... ) использовал фейслеты для jsf 1.1, поэтому не уверен, что это лучше в более поздних версиях.

Насколько динамичен / сколькос какими-то разными лицами вы должны иметь дело? Причина, по которой я спрашиваю, состоит в том, чтобы вы могли (позаимствовать термин у мастеров компилятора) развернуть свой цикл. Вместо

<ui:repeat value="#{panels}" var="panel">
  <ui:include src="#{panel.facelet}">
</ui:repeat>

Вы могли бы сделать

<custom:panelOneFacelet rendered="#{hasPanel1}" />
<custom:panelTwoFacelet rendered="#{hasPanel2}" />
<!-- etc... -->

И в вашем фейс-лите вы могли бы иметь что-то вроде:

<c:if test="#rendered" >
    <!-- EVERYTHING IN THE FACELET HERE!!!-->
</c:if>

Такой подход low-tech подходит для небольшого контролируемого набора, но если у вас очень большой и разнообразный набор лицевых граней, это может не сработать.

Могу я спросить, почему, иногда с пониманием высокого уровня, гуру СО могут предлагать гораздо более простые идеи длядостижение той же цели

...