这让我今天疯狂,所以我需要弄清楚我是做错了什么,或者从根本上误解了这是怎么回事。
我有一个自定义控件,有两个标签从同一个支持bean计算,如下所示:
<xp:text
id="test1"
value="#{claimsFiledReport.rows}">
</xp:text>
<xp:repeat
id="repeatDataRows"
value="#{claimsFiledReport.rows}"
var="row"
repeatControls="true">
<... stuff here ...>
</xp:repeat>
支持bean正在提供这样的信息:
public List<List<String>> getRows() {
System.out.println("running getRows()");
List<List<String>> list = new ArrayList<List<String>>();
for (ReportLine line : getLines().values()) {
List<String> lineData = new ArrayList<String>();
lineData.addAll(line.getValueStringList());
list.add(lineData);
}
return list;
}
现在我不明白:
当我第一次加载页面时,控制台会打印running getRows()
两次,而在浏览器中,所有内容都是空白的,因为报告尚未运行。然后我有一个按钮来运行报告并刷新包含这两个控件的表。发生这种情况时,running getRows()
仅打印一次,只有文本控件显示数据。重复控制保持空白。所以唯一有意义的是重复控制缓存了getRows()的结果,但这并不是我期望的行为。
另外,如果我将runReport()
作为getRows()
的第一行,那么我的表会填充默认数据,如果我尝试更改我的过滤器并重新运行报告,表格会保持不变,而计算的文本更新。
所以我的问题是我是否误解了重复控件如何与支持bean接口,如果是这样,如何解决这个问题,或者如果我遇到某些类型的实现问题,我就不能理解找到。
答案 0 :(得分:1)
repeatControls="true"
表示&#34;获取页面加载时重复的内容,并且从不在此之后#34;。因此重复的内容是第一次加载页面时的内容。在您的第一个示例中,runReport()
没有数据,因此重复为空。在第二个示例中,设置了runReport()
,因此报告为空。但repeatControls为true意味着它为runReport()
的每个元素创建了一组控件并存储了这些控件。
计算字段控件虽然会显示最新信息,因为它的值是动态的。
将其想象为在面板上设置loaded="#{viewScope.myVal==true}"
并尝试使用部分刷新通过设置viewScope.myVal=true
来显示该面板。同样,您可以获得页面加载时的功能。
基本上,如果您想要重复更改内容(包括使用寻呼机),则无法使用repeatControl="true"
。
设置repeatControls和对重复值使用页面加载绑定($ {...})之间的区别在于,通过执行页面加载绑定,您仍然可以使用寻呼机。用例是如果要在组件树中构建重复控件的内容,但是从组件树中删除重复。
getRows()将在页面加载时运行两次,因为它是从两个组件调用的,这很好。