Как условно выполнить <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.
Какой правильный способ сделать это?
Ответы
Ответ 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>