2012-11-27 45 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>一起使用它们。但我知道我没有问题,包括在过去的重复内部的自定义组件,如果这是有帮助的...