0

我想動態地顯示可用的頁面鏈接菜單,具體取決於使用Tapestry登錄哪種類型的用戶。我在Layout.tml代碼如何將當前循環值傳遞給Tapestry中的類方法?

部分看起來是這樣的:

<div class="header"> 
     <t:if t:test="userLoggedIn"> 
     <div class="menu"> 
      <ul> 
       <t:loop t:type="loop" source="pageNames" value="pageName" class="prop:classForPageName"> 
        <t:if t:test="isUserAllowedOnPage('pageName')"> 
         <li> 
          <t:pagelink page="prop:pageName.name">${pageName.displayName}</t:pagelink> 
         </li> 
        </t:if> 
       </t:loop> 
      </ul> 
     </div> 
     </t:if> 
     <div style="clear:both;"></div> 
    </div> 

在我Layout.java我有以下方法:

public boolean isUserAllowedOnPage(String pageName) { 
    // My logic here, returns either true or false 
} 

的問題是,我不知道如何來通過實際的頁面名稱參數爲isUserAllowedOnPage(String pageName)方法,因爲用下面一行tml代碼
"isUserAllowedOnPage('pageName')" 我傳遞一個實際的字符串,"pageName"而不是其中一個所需值(例如,"Index","About","Contacts" ...)。

回答

6

你的循環指定value="pageName"這意味着掛毯將更新pageName每次迭代通過循環時,頁面中的屬性。因此,您不需要將它傳遞給方法,因爲每次調用方法時都已經設置了它。 你可以只做到以下幾點:

TML

<t:loop source="pageNames" value="pageName"> 
    <t:if t:test="userAllowedOnPage"> 
     ... 
    </t:if> 
</t:loop> 

的Java

@Property 
private List<String> pageNames; 

@Property 
private String pageName; 
... 
public boolean isUserAllowedOnPage() { 
    // some calculation based on pageName 
} 
2

可以傳遞價值的方法沒有引號,如果你用Java編寫代碼的表達:

<t:if t:test="isUserAllowedOnPage(pageName)"> 
</t:if> 

或者:

<t:if t:test="isUserAllowedOnPage(getPageName())"> 
</t:if> 
+0

我知道這可能不是最好的做法,但我想從外循環當前迭代值我'Layout.tml',而不是'Layout#getPageName()'方法。 – Lopina

+1

組件模板沒有值,它只是一個視圖。所有的值都存儲在java類中。所以當你寫' sody

相關問題