Как я могу условно сделать? - PullRequest
18 голосов
/ 06 декабря 2010

Я хотел бы иметь возможность условно опустить нижний колонтитул в элементе панели PrimeFaces:

<p:panel header="some text">
    <f:facet name="footer">
        #{message}
    </f:facet>
    <!-- ... -->
</p:panel>

Я надеялся, что атрибут rendered будет работать:

<p:panel header="some text">
    <f:facet name="footer" rendered="#{!empty message}">
        #{message}
    </f:facet>
    <!-- ... -->
</p:panel>

Но нижний колонтитул по-прежнему отображается с пустым содержимым. Похоже, что facet не имеет атрибута rendered: http://www.jsftoolbox.com/documentation/help/12-TagReference/core/f_facet.html.

Какой правильный способ сделать это?

Ответы [ 11 ]

14 голосов
/ 07 декабря 2010

Я смог решить эту проблему, поменяв facet на attribute. Подведем итог:

Это работает

<p:panel ...>
    <f:attribute name="footer" value="#{message}"/>
    <!-- ... -->
</p:panel>

Но это не работает

<p:panel footer="#{message}">
    <!-- ... -->
</p:panel>

Это тоже не делает

<p:panel ...>
    <f:facet name="footer">#{message}</f:facet>
    <!-- ... -->
</p:panel>

Ни это

<p:panel ...>
    <f:facet name="footer">
        <h:outputText value="#{message}" rendered="#{!empty message}"/>
    </f:facet>
    <!-- ... -->
</p:panel>

под "работами" я имею в виду:

"отображает нет нижнего колонтитула & mdash; не просто пустой нижний колонтитул & mdash; когда #{message} пуст или null; в противном случае правильно отображается нижний колонтитул с указанным текстом."


Тема форума PrimeFaces по этому вопросу

8 голосов
/ 06 мая 2012

Вы можете объявить параметр ui: param и позволить шаблону проверять параметр при рендеринге.

Фасет в шаблоне может быть объявлен как:

<f:facet name="#{hideFooter == null or not hideFooter ? 'footer' : ''}">
     #{message}
</f:facet>

Любая страница может объявить этот параметр

<ui:param name='hideFooter' value='#{some rule}' />

и установите соответствующее правило для параметра. Для любой страницы, которая не объявляет параметр, будет отображаться нижний колонтитул.

6 голосов
/ 06 декабря 2010

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

<composite:interface>
    <composite:facet name="header" required="false" />
</composite:interface>
<composite:implementation>
    <p:panel>
        <c:if test="#{empty component.facets.header}" >
            <f:facet id="#{cc.attrs.id}_default_header" name="header">
            all sorts of stuff here
            </f:facet>
        </c:if>
        <c:if test="#{not empty component.facets.header}">
            <composite:insertFacet id="#{cc.attrs.id}_custom_header" name="header" />
        </c:if>
        <composite:insertChildren id="#{cc.attrs.id}_content"/>
    </p:panel>
</composite:implementation>

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

Это сочетание c: если в элементах управления jsf, но мы не увидели никаких побочных эффектов.

2 голосов
/ 31 января 2013

Я успешно решил эту проблему с помощью пользовательского интерфейса: фрагмент

<ui:fragment rendered="...Test...">
<f:facet name="footer">
...
</f:facet>
</ui:fragment>

работает, например, для условной рендеринга нижнего колонтитула простых чисел с данными (атрибут рендеринга фасета не работает).

2 голосов
/ 05 сентября 2011

Я сталкивался с подобной проблемой с простым JSF. Я не уверен, как <p:panel> отображается, но если он отображается как таблица, вы можете попробовать это:

Сначала объявите CSS-класс следующим образом:

.HideFooter tfoot {
    display: none;
}

Затем условно установите этот класс на панели:

<p:panel styleClass="#{renderFooterCondition ? null : 'HideFooter'}">

Нижний колонтитул по-прежнему отображается в JSF-смысле, но он не отображается и не занимает места на странице при просмотре пользовательским агентом.

0 голосов
/ 07 мая 2017

Попробуйте с веб-страницы primefaces

<p:columnGroup type="footer">
    <p:row>
        <p:column colspan="3" style="text-align:right" footerText="Totals:" />
        <p:column footerText="your value in ajax" />

        <p:column footerText="your value in ajax" />
    </p:row>
</p:columnGroup>

clik здесь , чтобы просмотреть веб-страницу primefaces

0 голосов
/ 07 ноября 2016

Это встречный ответ на ответ Людовика Пенета.

Это сработало для меня в <f:facet name="footer"> в отдельных p:column элементах ap: dataTable (Primefaces 5.3):

...

Обратите внимание, что у меня есть ui:fragment внутри f:facet, а не снаружи (без обтекания).Он определенно полностью удаляет всю строку, когда каждый аспект нижнего колонтитула проверяется на НЕ рендеринг (насколько я могу судить, независимо от содержимого в ui:fragment).

0 голосов
/ 10 сентября 2014

Я пробую это решение и хорошо. (http://www.coderanch.com/t/431222/JSF/java/dynamically-set-panel-header-condition)

<rich:dataGrid value="#{myMB.student.list}" rendered="#{!empty myMB.student and !empty myMB.student.list}" var="st" rowKeyVar="row">
    <rich:panel>                                            
        <f:facet name="header">
        <h:panelGroup id="panelHeader">
            <h:outputText value="Just one student" id="header1" required="true" rendered="#{!myMB.manyStudents}"/>
            <h:outputText value="#{row+1}º Student"  id="header2" required="true"  rendered="#{myMB.manyStudents}"/>
            </h:panelGroup>                                 
        </f:facet>
<rich:panel>
0 голосов
/ 03 марта 2014

Фасеты не предназначены для визуализации HTML, поэтому он не имеет атрибута render. Грани добавляют функциональности на страницу. Термин фасет, вероятно, плохой выбор имени. Это очень неоднозначно.

.. если список, составленный Филом Джонсоном из ITworld, это правильно, Самое сложное, что делают разработчики, это называть вещи .

т.

Фасеты JSF

Фасет проекта - это конкретная единица функциональности, которую можно добавить в проект, когда эта функциональность требуется. Когда в проект добавляется фасет проекта, он может добавлять в проект натуру, компоновщики, записи пути к классам и ресурсы в зависимости от характеристик конкретного проекта. Фасеты JSF определяют характеристики вашего веб-приложения с поддержкой JSF. Фасеты JSF определяют требования и ограничения, применимые к вашему проекту JSF.

Фасеты JSF обеспечивают набор вариантов поведения и возможностей для вашего веб-приложения.

0 голосов
/ 04 сентября 2013

Не уверен, насколько хорошо это будет работать для вашего нижнего колонтитула, но у меня была та же проблема с легендой, которую я пытался условно визуализировать. Я исправил это, используя визуализированный объект внутри тега фасета.

<p:fieldset>
<f:facet name="legend">
    <h:outputText value="#{header1}" rendered="#{header1.exists}"/>
    <h:outputText value="#{header2}" rendered="#{not header1.exists}"/>
</f:facet>
content
</p:fieldset>

Мне было трудно попробовать c: если с моим пользовательским интерфейсом: повторить, так что это было мое решение. Не совсем так, как ваша проблема, но похоже.

...