Xpages 导航器菜单

Xpages Navigator Menu

我的数据库有一个不错的动态导航器(尽管它不是动态导航器 - 我不明白那是什么)。

我加载了一些 sessionScope 变量。这些变量由用户在管理页面中输入数据驱动。

用户输入应用程序(应用程序栏)、标题(标题栏)——与一个或多个应用程序相关联,最后进入页面,与一个或多个标题相关联。

我在页面的导航控件中使用 repeats,然后在其下方的容器节点用于描述,然后另一个 repeat 用于页面中文档的类别,然后是视图的基本节点。效果不错。

我想要的是一些 sessionScope.page 变量有一个特殊的属性来表明它们不是文档的视图,但是在导航器中单击该页面将向用户显示一个文档并且它们可以编辑或保存它。

我不知道该怎么做。 所以在下面的屏幕截图中,如果用户单击 "Best Practices",它应该只在中间窗格中打开一个文档,而不是下面带有 "All" 的条目。

我认为这在重复控制中可能更容易,但欢迎任何建议。

谢谢!

<?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.resources>
        <xp:styleSheet href="/menus.css"></xp:styleSheet>
        <xp:styleSheet href="/buttons.css"></xp:styleSheet>
    </xp:this.resources>
    <xp:this.beforePageLoad><![CDATA[#{javascript:sessionScope.filterContent = "All";
setTags(sessionScope.selectedPage);}]]></xp:this.beforePageLoad>

    <xp:panel>
        <xe:navigator id="navigator1">
            <xe:this.treeNodes>
                <xe:repeatTreeNode var="entry" indexVar="index">
                    <xe:this.value><![CDATA[#{javascript:var tmpKey:String = sessionScope.selectedTitle;
sessionScope.render[tmpKey]}]]></xe:this.value>
                    <xe:this.children>
                        <xe:basicContainerNode
                            submitValue="#{javascript:entry}" style="font-size:10pt">
                            <xe:this.label><![CDATA[#{javascript:sessionScope.descriptions[entry]}]]></xe:this.label>
                            <xe:this.children>
                                <xe:repeatTreeNode var="entry2"
                                    indexVar="index2">
                                    <xe:this.value><![CDATA[#{javascript:var tmpArr = [];
tmpArr.unshift("All");
tmpArr2 = @Unique(@Trim(@DbColumn(@DbName(),sessionScope.selectedPage,1)));
if (tmpArr2.length == 0)
{var tmpArr3 = tmpArr}
else
{var tmpArr3 = tmpArr.concat(tmpArr2)}
tmpArr3}]]></xe:this.value>
                                    <xe:this.children>
                                        <xe:basicLeafNode
                                            label="#{javascript:entry2}"
                                            submitValue="#{javascript:entry2}" style="font-size:8pt">
                                            <xe:this.rendered><![CDATA[#{javascript:if (sessionScope.selectedPage == entry)
{return true}}]]></xe:this.rendered>
                                            <xe:this.selected><![CDATA[#{javascript:if (sessionScope.filterContent == entry2)
{return true}
else
{return false}}]]></xe:this.selected>
                                        </xe:basicLeafNode>
                                    </xe:this.children>
                                </xe:repeatTreeNode>
                            </xe:this.children>
                        </xe:basicContainerNode>
                    </xe:this.children>
                </xe:repeatTreeNode>
            </xe:this.treeNodes>
            <xp:eventHandler event="onItemClick" submit="true"
                refreshMode="complete">
                <xe:this.action><![CDATA[#{javascript:var tmpStr:String = context.getSubmittedValue(); 
var act:String;

if (tmpStr.substring(0,4) == "page")
{act = "page"}
if (tmpStr.substring(0,4) != "page")
{act = "cat"}

switch (act)
{
  case "page":
    // Do something
    sessionScope.selectedPage = tmpStr;
    sessionScope.filterType = "Categories";
    sessionScope.filterContent = "All";
    setTags(sessionScope.selectedPage);
    viewScope.tag = "";
    break;
  case "cat":
    // Do something else
    sessionScope.filterType = "Categories";
    sessionScope.filterContent = tmpStr; 
    viewScope.tag = "";
    break;
  default: 
    // Default case
    break;
}

</xp:view>

创建会话范围变量"type"。它为每个条目定义一个类型 "doc" 或 "view".

根据条目的类型 render 仅用于菜单条目的 basicLeafNode(在您的示例中 "Best Practices")或像以前一样的 basicContainerNode/basicLeafNode。使用 属性 rendered:

<xp:panel>
    <xe:navigator id="navigator1">
        <xe:this.treeNodes>
            <xe:repeatTreeNode var="entry" indexVar="index"
                value="#{javascript:sessionScope.render[sessionScope.selectedTitle]}">
                <xe:this.children>
                    <xe:basicLeafNode
                       rendered="#{javascript:sessionScope.type[entry] === 'doc'}"
                       label="#{javascript:sessionScope.descriptions[entry]}"
                       submitValue="#{javascript:entry}">
                    </xe:basicLeafNode>
                    <xe:basicContainerNode
                       rendered="#{javascript:sessionScope.type[entry] === 'view'}"
                       label="#{javascript:sessionScope.descriptions[entry]}"
                       submitValue="#{javascript:entry}"
                       style="font-size:10pt">
                       <xe:this.children>
                          <xe:repeatTreeNode
                             var="entry2"