2015-07-10 28 views
0

我开始了解Xpages的动态特性,并试图让我的代码更加简化。Xpage:以编程方式从会话变量设置自定义控件?

我在我的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> 

========================== ==================================== Knut,

这是一个很好的建议,但正如你所指出的,它只会在页面创建时加载。

有没有不同的方式来做我想做的事情,还是仅仅是更容易离开我原来的代码?

<?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的所有自定义控件的名字:包括它:

<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。

+0

如果仅计算一次,可以用$而不是#编码吗? –

+0

@Rob,你是对的。其实只有$是可能的。 –

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> 

ccName一个自定义属性添加到使用在CC的属性中的“属性定义”选项卡中的自定​​义控制。 Custom control custom property

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

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

前段时间我创建了一个组件来实时切换自定义控件。该代码可在github上获得: https://github.com/hasselbach/domino-ccinjector

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

相关问题