я смог получить дизайн через JSF2 / Ajax и richfaces4 (другие реализации были бы в порядке, я полагаю), где левый элемент меню навигации, реализованный с помощью шаблонов, способен визуализировать центральное содержимое шаблона с помощью ajax, предотвращаяполное обновление страницы и эффект мерцания.
мой код navigationmenu.xhtml выглядит следующим образом
<ui:composition>
<h:form id="navigationFormId">
<rich:collapsiblePanel id="carrierCollapsibleId" header="Links that update center content" switchType="client">
<h:commandLink id="linkId1" action="/page1" value="Update Center Content with page1">
<a4j:ajax execute="@form" render=":centerContentDiv,:centerForm" />
</h:commandLink>
<br />
<h:commandLink id="linkId2" action="/page2" value="Update Center Content with page2">
<a4j:ajax execute="@form" render=":centerContentDiv,:centerForm" />
</h:commandLink>
</rich:collapsiblePanel>
...
</h:form>
Я считаю, что атрибут render=":centerContentDiv,:centerForm"
для тегов a4j:ajax
можно изменить только на render=":centerForm"
, но я этого не проверял.Я знаю, что оба работают вместе, однако.Кроме того, я попробовал ajax-теги JSF2 с пробелами между идентификаторами и получил ошибки, поэтому я перешел на a4j richfaces 4.x и затем мог использовать запятые, если пробел не использовался.
теперь, чтобы это работало, каждый файл pageX.xhtml, например page1.xhtml, должен иметь <h:form id="centerForm">
, вот пример page1.xhtml
<ui:composition template="/templates/uiTemplate.xhtml">
<ui:define name="center_content">
<h:form id="centerForm">
<!-- put your components in here -->
</h:form>
</ui:define>
</ui:composition>
одно ограничение - каждое представление, использующее шаблон, должно определять <h:form id=centerForm" ...>
, иначе JSF2 будет жаловаться, что не может найти цель рендеринга.
В моем файле uiTemplate.xhtml есть код для верхнего и нижнего колонтитула, но соответствующая часть, в которой определено содержимое навигации и центра, выглядит следующим образом
<div class="header_content">
<div id="left">
<ui:include src="navigationMenu.xhtml" />
</div>
<div id="center_content">
<!-- think this panelGroup wrapper can be -->
<!-- removed. need to test that though -->
<h:panelGroup id="centerContentDiv" layout="block">
<ui:insert name="center_content" />
</h:panelGroup>
</div>
</div>