Xpages ExtLib Navigator控件的keepState属性不为';行不通

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"

我正在应用程序布局控件内的扩展库中测试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">

    <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
属性

但是,它有两个缺点:

  • 返回到导航器页面时,仅当 页面将直接重新加载/刷新。使用浏览器的“后退”按钮时不会恢复状态
  • 显然,twisty是与容器文本的单独链接。单击文本而不是扭曲时保存状态,控件的属性中不显示对扭曲的访问
  • 下面是更新后的代码,为简洁起见稍加编辑。对缺点的想法是受欢迎的

    <?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的人)想看看它