Подтвердить что ты не робот

Как условно выполнить <f: facet>?

Я хотел бы иметь возможность условно опустить нижний колонтитул из элемента панели 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.

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

4b9b3361

Ответ 1

Я смог решить это, заменив facet out на 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>

под "works" Я имею в виду:

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


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

Ответ 2

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

<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-контролерах, но мы не видели никаких побочных эффектов.

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

.HideFooter tfoot {
    display: none;
}

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

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

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

Ответ 5

Я успешно решил эту проблему, используя ui: fragment

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

работает, например, для того, чтобы conditionnaly визуализировать нижний колонтитул datatable (обработанный атрибут грани не работает).

Ответ 6

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

<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: если с моим ui: repeat, так это было моим решением. Не совсем то же самое, что и ваша проблема, но аналогичная.

Ответ 7

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

.. если список, составленный ITworld Phil Johnson, имеет это право, одна сложная вещь, которую делают разработчики, - назвать вещи.

т.

Аспекты JSF

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

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

Ответ 8

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

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

     ...     

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

Ответ 9

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

<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 здесь, чтобы просмотреть веб-страницу web-страниц

Ответ 10

Почему вы не добавляете содержимое нижнего колонтитула в группу PanelGroup с атрибутом rendered?

Таким образом:

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

Я делаю это в своем методе, и он работает, но нижний колонтитул не отображается.

Я не использую, однако, примитивы с h: datatable, но я думаю, что он тоже должен работать с панелью p:.

Ответ 11

Я пробую это решение и хорошо. (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>