重复标记缓存?

时间:2014-09-29 18:57:09

标签: xpages

这让我今天疯狂,所以我需要弄清楚我是做错了什么,或者从根本上误解了这是怎么回事。

我有一个自定义控件,有两个标签从同一个支持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接口,如果是这样,如何解决这个问题,或者如果我遇到某些类型的实现问题,我就不能理解找到。

1 个答案:

答案 0 :(得分:1)

repeatControls="true"表示&#34;获取页面加载时重复的内容,并且从不在此之后#34;。因此重复的内容是第一次加载页面时的内容。在您的第一个示例中,runReport()没有数据,因此重复为空。在第二个示例中,设置了runReport(),因此报告为空。但repeatControls为true意味着它为runReport()的每个元素创建了一组控件并存储了这些控件。

计算字段控件虽然会显示最新信息,因为它的值是动态的。

将其想象为在面板上设置loaded="#{viewScope.myVal==true}"并尝试使用部分刷新通过设置viewScope.myVal=true来显示该面板。同样,您可以获得页面加载时的功能。

基本上,如果您想要重复更改内容(包括使用寻呼机),则无法使用repeatControl="true"

设置repeatControls和对重复值使用页面加载绑定($ {...})之间的区别在于,通过执行页面加载绑定,您仍然可以使用寻呼机。用例是如果要在组件树中构建重复控件的内容,但是从组件树中删除重复。

getRows()将在页面加载时运行两次,因为它是从两个组件调用的,这很好。