重复中继器时发送寻呼机问题

时间:2015-11-05 14:31:39

标签: xpages

我正在使用当前最新的ExtLibs和带有FP3的Domino 9.0.1服务器。

我正在尝试使用从SQLite数据库获取数据的重复控件来设置我自己的多级分类视图,而我正在使用寻呼机控件。

结构

  1. 我有一个主要的重复控制,一次显示5个类别(部分)。它连接到主要寻呼机。
  2. 在这个重复控件中,我有一个面板,它对实际数据有另一个重复控制。 (在某些情况下,我将另一部分用另一个转发器创建多个级别......)
  3. *问题

    当我在主中继器上有多个页面时,我从第一页开始,然后在一个嵌入式寻呼机中,我选择第2页,然后在主寻呼机上选择一个不同的页面,然后所有嵌入式寻呼机自动重置为在我看来,好像控制嵌入式寻呼机号码的请求范围变量在所有重复的实例之间共享。

    解决此问题的最佳方法是什么?我是不是一开始就重复中继而吠叫错误的树?

    *******************************************独立的XPage for再现

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
        <xp:pager layout="Previous Group Next" partialRefresh="true"
            id="pager1" for="repeat1" panelPosition="left">
        </xp:pager>
    
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:repeat id="repeat1" rows="5" var="primaryList">
            <xp:this.value><![CDATA[#{javascript:var list:java.util.ArrayList = new java.util.ArrayList();
    list.add("1")
    list.add("2")
    list.add("3")
    list.add("4")
    list.add("5")
    list.add("6")
    list.add("7")
    list.add("8")
    list.add("9")
    list.add("10")
    list.add("11")
    list.add("12")
    list.add("13")
    list.add("14")
    list.add("15")
    list.add("16")
    list.add("17")
    list.add("18")
    return list;}]]></xp:this.value>
            <xp:section id="section1" header="#{javascript:primaryList}">
                <xp:br></xp:br>
                <xp:panel style="padding:0px 0px 5px 40px">
                    <xp:pager layout="Previous Group Next"
                        partialRefresh="true" id="pager2" for="repeat2"
                        panelPosition="left">
                    </xp:pager>
                    <xp:br></xp:br>
                    <xp:br></xp:br>
                    <xp:repeat id="repeat2" rows="5" var="innerRepeat">
                        <xp:this.value><![CDATA[#{javascript:var list:java.util.ArrayList = new java.util.ArrayList();
    list.add("1")
    list.add("2")
    list.add("3")
    list.add("4")
    list.add("5")
    list.add("6")
    list.add("7")
    list.add("8")
    list.add("9")
    list.add("10")
    list.add("11")
    list.add("12")
    list.add("13")
    list.add("14")
    list.add("15")
    list.add("16")
    list.add("17")
    list.add("18")
    return list;}]]></xp:this.value>
                        <xp:inputText id="inputText1"
                            value="#{javascript:innerRepeat.toString();}">
                        </xp:inputText>
                        <xp:br></xp:br>
                    </xp:repeat>
                </xp:panel></xp:section>
        </xp:repeat>
    </xp:view>
    

    重现的步骤

    1. 在主要寻呼机的第一页上。
    2. 在任何子寻呼机中,选择第2页。
    3. 注意其他寻呼机的正确性
    4. 将主要寻呼机切换到第3页
    5. 请注意第2页上的所有子寻呼机

1 个答案:

答案 0 :(得分:0)

我不认为这是一个错误。它按设计工作(!)......

问题是重复不会为每次迭代创建多个寻呼机。所以基本上只有一个寻呼机,该寻呼机只保留一个PagerState。这就是为什么他们表现得很奇怪。

使用repeatControls="true"选项时,repeat不会只迭代一个组件,而是为每次迭代创建多个组件。但是,在这种情况下,您不能使用Pager组件进行此类重复,因为新的重复组件不再具有迭代器。它将无法找到“分页”并且会抛出“零分区”错误。

在这里,我已经解释了重复组件的两种模式之间的区别(来自幻灯片#36):

https://speakerdeck.com/sbasegmez/engage-2015-10-mistakes-you-and-every-xpages-developer-make-yes-i-said-you?slide=36

解决方案是为内部重复创建自己的寻呼机设计。

更新

另一种方法是将外部重复标记为repeatControls="true"并删除外部寻呼机。在这样的配置中,组件树中将有多个寻呼机组件,但您必须牺牲外部寻呼机。在此配置中,您需要加载外部重复中的所有元素(因为它们不能再被主动操作)。

要模仿寻呼机行为,您可以设计自定义寻呼机,并使用rendered属性进行内部重复。它会降低页面速度,但会为用户提供“分页”感觉。