Xpage:以编程方式从会话变量设置自定义控件?

时间:2015-07-10 14:04:36

标签: xpages

我开始了解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>

3 个答案:

答案 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添加到自定义控件。 Custom control custom property

然后将其添加到XPage并传入sessionScope变量。

<xc:ccAll ccName="#{javascript:return sessionScope.pageSelected}"></xc:ccAll>

答案 2 :(得分:1)

前段时间我创建了一个可以即时切换自定义控件的组件。代码可以在github上找到: https://github.com/hasselbach/domino-ccinjector

组件可以随时注入自定义组件:在部分刷新期间或根据变量。