Xpages ExtLib Navigator控件的keepState属性不为';行不通
我正在应用程序布局控件内的扩展库中测试Navigator控件。主XPage上的nav有两个容器节点,每个节点包含两个页面节点。每个页面节点都指向一个普通的XPage,其中有一个“Return”按钮,该按钮具有加载主页的简单操作Xpages ExtLib Navigator控件的keepState属性不为';行不通,xpages,Xpages,我正在应用程序布局控件内的扩展库中测试Navigator控件。主XPage上的nav有两个容器节点,每个节点包含两个页面节点。每个页面节点都指向一个普通的XPage,其中有一个“Return”按钮,该按钮具有加载主页的简单操作 <?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"
<?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">
<xe:applicationLayout id="applicationLayout1">
<xe:this.configuration>
<xe:bootstrapResponsiveConfiguration
pageWidth="fluid" fixedNavbar="fixed-top" collapseLeftColumn="true" legal="false"
placeBar="false" titleBar="false" footer="false">
<xe:this.bannerApplicationLinks>
<xe:pageTreeNode label="Page 1" />
<xe:pageTreeNode label="Page 2" />
</xe:this.bannerApplicationLinks>
</xe:bootstrapResponsiveConfiguration>
</xe:this.configuration>
<xp:this.facets>
<xp:div xp:key="LeftColumn">
<xe:navigator id="navigator1" keepState="true" expandable="true">
<xe:this.treeNodes>
<xe:basicContainerNode label="Container 1">
<xe:this.children>
<xe:pageTreeNode label="a1" page="/a1.xsp" />
<xe:pageTreeNode label="a2" page="/a2.xsp" />
</xe:this.children>
</xe:basicContainerNode>
<xe:basicContainerNode label="Container 2">
<xe:this.children>
<xe:pageTreeNode label="a1" page="/a1.xsp" />
<xe:pageTreeNode label="a2" page="/a2.xsp" />
</xe:this.children>
</xe:basicContainerNode>
</xe:this.treeNodes>
</xe:navigator>
</xp:div>
</xp:this.facets>
</xe:applicationLayout>
</xp:view>
keepState
属性设置为true
,但是如果我折叠其中一个容器并转到另一个页面,容器将重新打开,并且在返回时不会保持其状态。无论我使用浏览器的“后退”按钮还是辅助页面上的“返回”按钮,都会发生这种情况
我是否误解了
keepState
属性,或者它已损坏?我已经在Google和OpenNTF上进行了搜索,但没有找到任何关于此问题的信息。我按照建议在Github上查看了代码,这确实是预期的功能:
定义在服务器请求之间是否应保存项目的折叠或扩展状态
由于它似乎已损坏,我提出了一种解决方法,使用navigator的onItemClick
事件将状态保存在sessionScope.navState
变量中。我将每个容器的状态作为一个条目存储在单个sessionScope
var的hashmap中,以避免多个容器使用多个var。然后从sessionScope.navState.[container name]
加载每个容器的expanded
属性
但是,它有两个缺点:
<?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>
[...]
Github上提供了该代码。您可以查看一下,看看是否可以找到“keepState”的用途:。@Per Henrik Lausten代码显示这是预期的功能,因此它似乎是一个bug。你认为值得向HCL报告吗?不确定他们是否费心修复XPages代码。您可以在Github项目中创建一个问题,并希望一些开源贡献者(或来自HCL的人)想看看它