如何在 Xpages 中使应用程序布局控件动态化
How to make the application layout control dynamic in Xpages
我一直致力于使 applicationLayout 自定义控件更加动态,这样我就可以更轻松地构建和扩展 Xpages 应用程序。
为此,我现在正在使用 switch 方面,这有很大帮助。
我还想对应用程序 Link、标题 Link 和导航条目进行软编码。
我想我可以构建一个数据结构,在其中放置我想要的值,大部分应用程序布局都是从中加载的。
所以我将在范围变量中有一个电器数组,如下所示:
“App 1”、“App 2”、“App 3”等
那么对于标题,我必须有这样的东西:
“应用程序 1”,“标题栏 1”,“标题栏 2”,“标题栏 3”,
“App 2”、“标题栏 1”、“标题栏 2”、“标题栏 3”、“标题栏 4”
“应用程序 2”,“标题栏 1”,
所以第一个应用程序 Link 将有三个标题栏,第二个应用程序有 4 个,依此类推
然后导航:
“应用程序 1”,“标题栏 1”,“导航 1”,“导航 2”
“应用程序 1”,“标题栏 1”,“导航 1”,“导航 2”,“导航 3”
等等。
如果我这样做,那么我认为布局应用程序将非常容易。
我的问题是什么数据结构最好用?我应该使用三个数组还是在 3 维数组上?
============================================= ======================
Knut 的回答很好,但我似乎无法遍历数组。
var lenArr:Integer = sessionScope.apps.length;
for (i=0; i < lenArr;++i)
{sessionScope.apps[i].app}
当我对 session.Scope 变量进行长度处理时,它 returns 为 3,但是当我循环遍历数组时,它 returns 当 i=2 时为空。我的数组中只有 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的数组和objects定义您的应用程序结构
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
第一个应用的第一个 titleBar 的第二个导航
sessionScope.apps[0].titleBars[0].navs[1]
使用 for
循环或 forEach
获取数组的所有元素。
我一直致力于使 applicationLayout 自定义控件更加动态,这样我就可以更轻松地构建和扩展 Xpages 应用程序。
为此,我现在正在使用 switch 方面,这有很大帮助。
我还想对应用程序 Link、标题 Link 和导航条目进行软编码。
我想我可以构建一个数据结构,在其中放置我想要的值,大部分应用程序布局都是从中加载的。
所以我将在范围变量中有一个电器数组,如下所示:
“App 1”、“App 2”、“App 3”等
那么对于标题,我必须有这样的东西:
“应用程序 1”,“标题栏 1”,“标题栏 2”,“标题栏 3”, “App 2”、“标题栏 1”、“标题栏 2”、“标题栏 3”、“标题栏 4” “应用程序 2”,“标题栏 1”,
所以第一个应用程序 Link 将有三个标题栏,第二个应用程序有 4 个,依此类推
然后导航:
“应用程序 1”,“标题栏 1”,“导航 1”,“导航 2” “应用程序 1”,“标题栏 1”,“导航 1”,“导航 2”,“导航 3”
等等。
如果我这样做,那么我认为布局应用程序将非常容易。
我的问题是什么数据结构最好用?我应该使用三个数组还是在 3 维数组上?
============================================= ====================== Knut 的回答很好,但我似乎无法遍历数组。
var lenArr:Integer = sessionScope.apps.length;
for (i=0; i < lenArr;++i)
{sessionScope.apps[i].app}
当我对 session.Scope 变量进行长度处理时,它 returns 为 3,但是当我循环遍历数组时,它 returns 当 i=2 时为空。我的数组中只有 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的数组和objects定义您的应用程序结构
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
第一个应用的第一个 titleBar 的第二个导航
sessionScope.apps[0].titleBars[0].navs[1]
使用 for
循环或 forEach
获取数组的所有元素。