【问题标题】:Xpage: programmatically set custom control from session variable?Xpage:以编程方式从会话变量设置自定义控件?
【发布时间】:2015-07-10 14:04:36
【问题描述】:

我开始了解 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 的代码就不必在不同的 Xpage 之间更改。我可以只用一个 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>

【问题讨论】:

  • 您总是可以为自定义控件创建一个属性,这就是您的要求吗?

标签: xpages


【解决方案1】:

您可以使用&lt;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。

【讨论】:

  • 如果只计算一次,可以用$而不是#来编码吗?
【解决方案2】:

您能否创建一个自定义控件来控制所有这些控件?将所需 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>

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2011-09-07
      • 2012-12-14
      相关资源
      最近更新 更多