2015-07-10 29 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

組件可以隨時注入自定義組件:在部分刷新期間或取決於變量。

相關問題