我开始了解Xpages的动态特性,并试图让我的编码更加简化。
我在我的xpages中使用switchFacet cc来控制要加载的自定义控件,具体取决于sessionScope变量中的值。
为了简单起见,我将cc的名称与sessionScope变量匹配。所以我最终得到了以下代码。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlnsstrong text:xc="http://www.ibm.com/xsp/custom"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xc:ccAppLayout>
<xp:this.facets>
<xc:ccAppNav xp:key="LeftColumn" />
<xe:switchFacet id="switchFacet1" xp:key="facet_1"
selectedFacet="#{javascript:return sessionScope.pageSelected}">
<xp:this.facets>
<xc:cpApp2Title1Page1 xp:key="cpApp2Title1Page1" />
<xc:cpApp2Title2Page1 xp:key="cpApp2Title2Page1" />
<xc:cpApp2Title2Page2 xp:key="cpApp2Title2Page2" />
<xc:cpApp2Title3Page1 xp:key="cpApp2Title3Page1" />
</xp:this.facets>
</xe:switchFacet>
</xp:this.facets>
</xc:ccAppLayout>
</xp:view>
不差,但在我看来,如果我可以直接将cc 设置为 sessionScope变量,那么事情会更加清晰。这样,此Xpage的代码就不必在不同的Xpages之间进行更改。我只能使用一个Xpage。
有没有办法做到这一点,这是一个好主意吗?
布赖恩
=============================================== 我正在寻找的是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlnsstrong text:xc="http://www.ibm.com/xsp/custom"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xc:ccAppLayout>
<xp:this.facets>
<xc:ccAppNav xp:key="LeftColumn" />
<xc:#{javascript:return sessionScope.pageSelected} xp:key="facet_1"></xc:#{javascript:return sessionScope.pageSelected}>
</xp:this.facets>
</xc:ccAppLayout>
</xp:view>
=============================================== =============== 克努特,
这是一个很好的建议,但正如您所指出的那样,只会在页面创建时加载。
有没有不同的方式来做我想要的,或者更容易留下我原来拥有的代码?
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xc:ccAppLayout>
<xp:this.facets>
<xc:ccAppNav xp:key="LeftColumn" />
<xp:include id="include1" xp:key="facet_1">
<xp:this.pageName><![CDATA[${javascript:sessionScope.pageSelected + ".xsp"}]]></xp:this.pageName>
</xp:include></xp:this.facets>
</xc:ccAppLayout>
</xp:view>
答案 0 :(得分:2)
您可以使用<xp:include...
和“计算”自定义控件的名称:
<xp:include pageName="${sessionScope.yourCC}" />
sessionScope变量必须包含自定义控件的名称,如“cpApp2Title1Page1.xsp”。最后不要忘记“.xsp”。
请注意,pageName只会在第一页加载时计算一次。
我从您之前的问题中得知,您希望在sessionScope变量中保持可能的页面灵活。假设你有一个sessionScope变量pages
,其中包含所有自定义控件名称作为数组,那么你将使用重复并将xp:include放入其中:
<xp:repeat
id="repeat1"
rows="30"
var="key"
repeatControls="true"
value="${sessionScope.pages}">
<xp:panel
rendered="#{javascript:sessionScope.pageSelected == key}">
<xp:include
pageName="${javascript:key + '.xsp'}" />
</xp:panel>
</xp:repeat>
它将包含 所有页面在sessionScope变量pages
中定义,但渲染仅一个 sessionScope变量pageSelected
中包含名称的页面。
您将上面的代码包含在您的switchFacet中。
答案 1 :(得分:1)
你能创建一个自定义控件来统治它们吗?将所需CC的名称作为自定义属性的CC,然后仅呈现所需的CC。因此,将switchFacet推入新的自定义控件,例如ccAll.xsp:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xc="http://www.ibm.com/xsp/custom"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xe:switchFacet id="switchFacet1" selectedFacet="#{javascript:return compositeData.ccName}">
<xp:this.facets>
<xc:cc1 xp:key="cc1" />
<xc:cc2 xp:key="cc2" />
<xc:cc3 xp:key="cc3" />
</xp:this.facets>
</xe:switchFacet>
</xp:view>
使用CC属性中的“属性定义”选项卡将自定义属性ccName
添加到自定义控件。
然后将其添加到XPage并传入sessionScope变量。
<xc:ccAll ccName="#{javascript:return sessionScope.pageSelected}"></xc:ccAll>
答案 2 :(得分:1)
前段时间我创建了一个可以即时切换自定义控件的组件。代码可以在github上找到: https://github.com/hasselbach/domino-ccinjector
组件可以随时注入自定义组件:在部分刷新期间或根据变量。