如何使Xpages中的应用程序布局控件动态

如何使Xpages中的应用程序布局控件动态,xpages,xpages-extlib,Xpages,Xpages Extlib,我一直在努力使applicationLayout自定义控件更具动态性,以便更轻松地构建和扩展Xpages应用程序 为此,我现在使用switch facet,这非常有帮助 我还想对应用程序链接、标题链接和导航条目进行软编码 我想我可以构建一个数据结构,在其中我只需要输入我想要的值,大多数应用程序布局都是从中加载的 因此,我将在一个范围变量中包含一个设备数组,如下所示: “应用程序1”、“应用程序2”、“应用程序3”等 那么对于标题,我必须有这样的东西: “应用程序1”、“标题栏1”、“标题栏2”、

我一直在努力使applicationLayout自定义控件更具动态性,以便更轻松地构建和扩展Xpages应用程序

为此,我现在使用switch facet,这非常有帮助

我还想对应用程序链接、标题链接和导航条目进行软编码

我想我可以构建一个数据结构,在其中我只需要输入我想要的值,大多数应用程序布局都是从中加载的

因此,我将在一个范围变量中包含一个设备数组,如下所示:

“应用程序1”、“应用程序2”、“应用程序3”等

那么对于标题,我必须有这样的东西:

“应用程序1”、“标题栏1”、“标题栏2”、“标题栏3”, “应用程序2”、“标题栏1”、“标题栏2”、“标题栏3”、“标题栏4” “应用程序2”、“标题栏1”

因此,第一个应用程序链接将有三个标题栏,第二个是4,等等

那么对于导航:

“应用程序1”、“标题栏1”、“导航1”、“导航2” “应用程序1”、“标题栏1”、“导航1”、“导航2”、“导航3”

等等

如果我这样做的话,我想设计一个应用程序会很容易

我的问题是什么样的数据结构最适合使用?我应该使用三个数组还是三维数组

=================================================================== 克努特的回答很好,但我似乎无法在数组中循环

var lenArr:Integer = sessionScope.apps.length;
for (i=0; i < lenArr;++i)
{sessionScope.apps[i].app}
var lenArr:Integer=sessionScope.apps.length;
对于(i=0;i
当我对session.Scope变量进行长度计算时,它返回3,但当我循环遍历数组时,当I=2时,它返回null。数组中只有2项,至少应该有。下面是我的sessionScope代码

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    rendered="false"
    viewState="nostate"
    xmlns:xc="http://www.ibm.com/xsp/custom">
    <xp:this.afterPageLoad><![CDATA[#{javascript:sessionScope.apps = 
     [
      { app: "xpApp1",
        titleBars: [
                    {titleBar: "ccApp1Title1",
                     navs: ["ccNavApp11Title1Nav1"]
                    },
                    {titleBar: "ccApp1Title1",
                     navs: ["ccNavApp11Title1Nav2"]
                    }
                   ]
      },
     { app: "xpApp2",
        titleBars: [
                    {titleBar: "ccApp2Title1",
                    navs: ["ccNavApp21Title1Nav1"]
                    },
                    {titleBar: "ccApp2Title2",
                    navs: ["ccNavApp21Title2Nav1"]
                    }
                     {titleBar: "ccApp2Title3",
                    navs: ["ccNavApp21Title3Nav1"]
                    }
                   ]
      },
    ];
//Now set the selected values
sessionScope.appSelected = "xpApp1";
sessionScope.titleSelected = "ccApp1Title1";
sessionScope.navSelected = "ccNavApp11Title1Nav1";
var uAgent = context.getUserAgent().getUserAgent();
if((uAgent.match("iPhone") !== null || param.platform=="iphone") ||
(uAgent.match("Android") !== null || param.platform=="android") ||
uAgent.match("iPad") !== null){
context.redirectToPage("/mobile.xsp", true);
}else{
context.redirectToPage("/xpApp1.xsp", true);    
}   }]]></xp:this.afterPageLoad>
</xp:view>


我做错了什么?

使用JavaScript的数组和对象来定义应用程序结构

sessionScope.apps = 
     [
      { app: "App 1",
        titleBars: [
                    {titleBar: "Title Bar 1",
                     navs: ["Nav 1", "Nav 2", "Nav 3"]
                    },
                    {titleBar: "Title Bar 2",
                     navs: ["Nav 4", "Nav 5", "Nav 6"]
                    }
                   ]
      },
      { app: "App 2",
        titleBars: [
                    {titleBar: "Title Bar 3",
                     navs: ["Nav 31", "Nav 32", "Nav 33"]
                    },
                    {titleBar: "Title Bar 4",
                     navs: ["Nav 41", "Nav 42"]
                    }
                   ]
      }
    ];
您可以使用访问第一个应用程序

sessionScope.apps[0].app
第一个应用程序的第一个标题栏

sessionScope.apps[0].titleBars[0].titleBar
第一个应用程序的第一个标题栏的第二个导航

sessionScope.apps[0].titleBars[0].navs[1]

使用
for
循环或
forEach
获取数组的所有元素。

Knut这很好,但是我在sessionScope变量上循环时遇到了问题。我在上面的问题中添加了。Bryan,不要在sessionScope.apps定义中设置最后一个逗号。它会创建第三个空元素。结尾应该是这样的:
];
Bryan,不要在sessionScope.apps定义中设置最后一个逗号。它会创建第三个空元素。定义的结尾应如下所示:
}];