Я просмотрел код на Github в соответствии с предложением Пера, и это действительно предполагаемая функциональность:
Определяет, следует ли сохранять свернутые или развернутые состояния элементов между запросами к серверу
Так как он кажется неисправным, я нашел обходной путь, используя событие навигатора onItemClick
для сохранения состояния в переменной sessionScope.navState
. Я сохраняю состояние каждого контейнера как запись в хэш-карте в одной переменной sessionScope
, чтобы избежать нескольких переменных для нескольких контейнеров. Свойство expanded
каждого контейнера затем загружается из sessionScope.navState.[container name]
.
Однако у него есть два недостатка:
- При возврате на страницу навигатора состояние восстанавливается только тогда, когда страница напрямую перезагружается / обновляется. Состояние НЕ восстанавливается при использовании кнопки «Назад» в браузере.
- Очевидно, что поворот - это отдельная ссылка из текста контейнера. Состояние сохраняется при нажатии на текст, но не на поворот, и доступ к повороту не отображается в свойствах элемента управления.
Обновленный код ниже, слегка отредактированный для краткости. Идеи для недостатков приветствуются.
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:this.beforePageLoad><![CDATA[#{javascript:
//initialize navigator state
if (sessionScope.navState == null) {
sessionScope.navState = new java.util.HashMap();
sessionScope.navState.put("c1", false);
sessionScope.navState.put("c2", false);
}}]]></xp:this.beforePageLoad>
<xe:applicationLayout id="applicationLayout1">
<xe:this.configuration>
[...]
</xe:this.configuration>
<xp:this.facets>
<xp:div xp:key="LeftColumn">
<xe:navigator id="navigator1" keepState="true" expandable="true">
<xp:eventHandler event="onItemClick" submit="true"
refreshMode="partial" refreshId="navigator1">
<xe:this.action><![CDATA[#{javascript:
var entry = context.getSubmittedValue();
sessionScope.navState.put(entry, !sessionScope.navState.get(entry));
}]]></xe:this.action>
</xp:eventHandler>
<xe:this.treeNodes>
<xe:basicContainerNode label="Container 1"
submitValue="c1" expanded="#{javascript:sessionScope.navState.c1}">
<xe:this.children>
<xe:pageTreeNode label="hello" page="/a1.xsp" />
<xe:pageTreeNode label="goodbye" page="/a2.xsp" />
</xe:this.children>
</xe:basicContainerNode>
<xe:basicContainerNode label="Container 2"
submitValue="c2" expanded="#{javascript:sessionScope.navState.c2}">
<xe:this.children>
<xe:pageTreeNode label="hello" page="/a1.xsp" />
<xe:pageTreeNode label="goodbye" page="/a2.xsp" />
</xe:this.children>
</xe:basicContainerNode>
</xe:this.treeNodes>
</xe:navigator>
</xp:div>
</xp:this.facets>
</xe:applicationLayout>
</xp:view>