2012-11-27 71 views
-2

我希望getter方法在多次調用時返回不同的值。類似下面的一個:VisualForce只調用一次getter方法

Iterator<String> itr = new List<String>{'one','two','three','four','five'}.iterator(); 

public String getValue(){ 
    if(itr.hasNext()) 
     return itr.next(); 
    else 
     return 'No more values'; 
} 

,我用它作爲這樣的:

<!-- getNumber() called 5 times in a single visualforce page, NOT in a loop --> 
{!value} 
{!value} 
{!value} 
{!value} 
{!value} 
{!value} 

,輸出是:

one one one one one one 

有沒有辦法把它打印出來如:

one two three four five No more values 

似乎解析器只調用一次getValue()並緩存頁面其餘部分的值。

使迭代靜態或

+0

Visualforce文檔明確告訴我們「不要在你的getters或setters中使用副作用!並且不要指望獲取者和設置者被調用的數量或順序。你爲什麼想要做這種可憎的事? http://www.salesforce.com/us/developer/docs/pages/index_Left.htm#StartTopic=Content/pages_controller_lifecycle_example.htm – eyescream

+0

主要是因爲不起作用一個<尖頂:重複...> 我有一個非常有限的頁面列表,我希望包括(只有10),但順序可能會改變。 – CodeBaker

回答

0

副作用,請不要使用干將......我並不感到驚訝,他們實際上是在緩存值和無transient量能拯救你。

你可以拉斷即通過暴露List<String> values {get;private set;},然後在Visualforce調用{!values[3]}甚至{!values[i]}(其中i可以從控制器的整型變量,甚至<apex:variable>雖然這是相當硬派......只是有點您的字符串/頁名稱的數組在控制器和「固定的順序」使用關於VF側的索引顯示它們?

(陣列語法是相當強大的方式,如果你有String fieldName = 'AccountNumber';,可以有運行時與VF {!acc[fieldName]}結合)

另一種選擇是探索Dynamic Visu alforce組件?看來你不能和<apex:include>一起使用它們。但我知道我沒有問題,包括在過去的重複內部的自定義組件,如果這是有幫助的...