2016-05-12 57 views
1

我在XPages中創建了一個基於用戶角色的渲染規則的計算菜單。 我的菜單的值是從計算字段中的視圖計算得出的。 這是我的菜單代碼:XPages中的動態渲染公式菜單

<div id='cssmenu'> 
<ul><li class='active has-sub'> 
<a href='#'>Title1</a> 
<ul> 
<xp:text escape="true" disableTheme="true" contentType="html"> 
<xp:this.value> 
<![CDATA[#{javascript:var arr= @DbColumn(@DbName(), "vwMenu", 4); 
arr.join("");}]]> 
</xp:this.value> 
</xp:text> 
</ul> 
</li> 
</ul> 
</div> 

從我的數組中的元素的值給出例如以下代碼:

<li class='has-sub'> 
<a href=https://mylink.com>Link1</a> 
<xp:panel> 
<xp:this.rendered> 
<![CDATA[${javascript:context.getUser().getRoles().contains('[USER1]')}]]> 
</xp:this.rendered> 
<ul> 
    <li><a href=https://MyPage.com>Link2</a></li> 
</ul> 
</xp:panel> 
</li> 

菜單顯示細所以HTML代碼ok.But的XML部分關於鏈路2上的可視性沒有。鏈接2不可見,無論連接用戶的角色如何。我認爲這是一個問題,發生在我使用JavaScript代碼的XML代碼。 也許是因爲我的計算字段的內容類型是html,我的渲染代碼是xml。

回答

1

您忘記帶撇號'包圍href屬性:

<li class='has-sub'> 
      <a href='https://mylink.com'>Link1</a> 
      <xp:panel> 
       <xp:this.rendered> 
    <![CDATA[${javascript:context.getUser().getRoles().contains('[USER1]')}]]> 
       </xp:this.rendered> 
       <ul> 
        <li> 
         <a href='https://MyPage.com'>Link2</a> 
        </li> 
       </ul> 
      </xp:panel> 
     </li> 
+0

菜單與工作中有無URL撇號。它不工作,只有當我把渲染規則取決於用戶角色。 – user3082877

1

方法.contains()區分大小寫。確保在ACL中設置的角色正好是[USER1]。你呈現的代碼適合我。

你可能會有些添加打印渲染代碼,用於測試目的:

enter image description here

href值有:

 <xp:this.rendered> 
      <![CDATA[${javascript: 
       print(context.getUser()); 
       print(context.getUser().getRoles()); 
       context.getUser().getRoles().contains('[USER1]')}]]> 
     </xp:this.rendered> 

您可以在服務器控制檯,然後真正發生在你的代碼中看到被引號或單引號包圍。否則,你會得到一個語法錯誤,你在XPage上所做的更改不會生效。

更新

正如你在評論中提到,你把HTML和包含的JavaScript代碼到計算領域。這是行不通的,因爲內容直接發送到瀏覽器,並且這種方式包括JavaScript代碼不會在服務器上執行。

相反,使用重複控制創建菜單項:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view 
    xmlns:xp="http://www.ibm.com/xsp/core"> 
    <ul> 
     <li> 
      <a href="https://mylink.com">Link1</a> 
      <xp:panel> 
       <xp:this.rendered> 
        <![CDATA[${javascript: 
         context.getUser().getRoles().contains('[USER1]')}]]> 
       </xp:this.rendered> 
       <ul> 
        <xp:repeat 
         var="link"> 
         <xp:this.value><![CDATA[#{javascript: 
          ["https://MyPage.com", "https://www.google.com"] 
         }]]></xp:this.value> 
         <li> 
          <a href="#{link}"> 
           <xp:text escape="true" 
            value="#{javascript:'Link to ' + link}" /> 
          </a> 
         </li> 
        </xp:repeat> 
       </ul> 
      </xp:panel> 
     </li> 
    </ul> 
</xp:view> 
+0

謝謝你的回答。當我檢查我的菜單代碼到瀏覽器中時,我看到渲染部分被評論。通常,渲染規則不會出現在源代碼中,因爲它必須由服務器解釋。 <! - [CDATA [$ {javascript:context.getUser()。getRoles()。contains('[USER1]')}]] - > user3082877

+0

即使我添加了打印件,當我檢查源代碼時,它們仍會被評論。我在控制檯上沒有打印。 – user3082877

+0

我使用XPage更新了我的代碼。從那裏出發。 –