Условно предоставляя <ui: include>

Я пытаюсь переключить страницу с <rich:dataTable>. Прежде чем я включил шаблон <ui:include>, и он просто покажет таблицу все время.

<ui:include src="../log/viewDlg.xhtml"/>

Теперь я хочу иметь возможность включать/отключать его на веб-странице. Отображение на странице с помощью кнопки или ссылки. Как я могу это достичь?


Обновление 1: Я не могу заставить его появляться по какой-то нечетной причине. Вот что я написал до сих пор на основе обратной связи

Вид:

<a4j:commandLink value="View"
    action="#{bean.showview}" render="viewPanel"/>

<h:panelGroup id="viewPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{bean.showPolicyView}">    
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>                         
</h:panelGroup>

Поддержка bean:

private boolean showPolicyView = false;

public void showView() {
    showPolicyView = !showPolicyView;
}

public boolean isShowPolicyView(){
    return showPolicyView;
}

Ответ 1

Оберните <ui:include> внутри двух элементов <h:panelGroup>. Здесь есть уловка, вы не можете переопределить условный компонент. Почему это? потому что когда атрибут rendered разрешает false, он не будет рассматриваться при рендеринге представления, поэтому он не может быть целью операции (в данном случае связанной с визуализацией).

Прыгая к коду, вы получите следующее:

<h:panelGroup id="wrapperPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{yourBean.renderTable}">
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>
</h:panelGroup>

yourBean#renderTable - это свойство Boolean, которое определяет, будет ли компонент отображаться. Когда он оценивает значение false, компонент не включается в дерево компонентов.


Переключение вида

Чтобы переключить представление, просто создайте метод bean, который обновит страницу

<h:commandLink action="#{yourBean.toggleTableView}"/>

или конкретной панели через AJAX. Чтобы сделать это в JSF 1.2, полагайтесь на расширения, такие как RichFaces, чтобы представить AJAX, если сможете. Например, если вы выбрали RichFaces, вы можете использовать <a4j:commandLink/> и его удобный render (или reRender в более старых версиях) атрибут для достижения того, что вы могли бы сделать с помощью <f:ajax/> в JSF 2

<a4j:commandLink action="#{yourBean.toggleTableView}" reRender="wrapperPannel"/>

Или другой вариант -

<a4j:commandLink action="#{yourBean.toggleTableView}">
    <a4j:support event="oncomplete" reRender="wrapperPannel"/>
</a4j:commandLink>

Обратите внимание, что атрибут reRender может отличаться в зависимости от структуры вашей страницы, но в конце должен всегда ссылаться на идентификатор панели обертки. Кроме того, reRender был переименован в просто render в поздних версиях RichFaces.

Итак, если у вас есть свойство renderTable (getter + setter) в yourBean, toggleTableView должен его изменить, чтобы динамически определить, должен ли компонент быть рендер или нет (renderTable = false).


Знакомство с RichFaces

Проверьте эту ссылку за помощью в настройке RichFaces в вашем проекте.

Ответ 2

Мне нравится использование обработчиков тегов лучше, чем вставка h:panelBoxes как здесь:

<c:choose> <c:when test="#{myBean.yourCondition()}"> <ui:include src="viewA.xhtml"/> </c:when> <c:otherwise> <ui:include src="viewB.xhtml"/> </c:otherwise> </c:choose>

Преимущество: обработчики тегов не представляют компоненты и никогда не становятся частью дерева компонентов после построения представления. Это не будет мешать вашему CSS - h:panelBox, напротив, вставляет div или span.

При работе с обработчиками тегов (например, c:xxx) необходимо знать разницу между компонентами пользовательского интерфейса и обработчиками тегов. А именно, что компоненты пользовательского интерфейса и обработчики тегов визуализируются на разных этапах. Это означает, что вы не можете создать переменную в составном компоненте и использовать ее в обработчике вложенных тегов. c:choose и ui:include являются обработчиками тегов, поэтому обычно это не проблема. Прочитайте ссылку, это очень короткий пример и очень проницательный.