xp:repeat 里面 xe:dataView

xp:repeat inside xe:dataView

我目前在 xe:dataView 中使用 xp:repeat 时遇到一些问题。

场景: 我正在使用 xe:dataview 重复一些对象(相同类型)并在表单中显示它们,但有些对象包含更多字段相对于其它的。所以我必须创建字段并使用 xp:repeat.

进行动态值绑定

我的问题: 我无法使用我的 dataView 的 var="rowvar" 来计算我的 repeat 控件的 value=""。但是我需要在当前行中引用我的对象来计算字段。

这是我的代码的简单版本(在我的真实场景中,obj 是一个 Java 模型对象):

<xe:dataView
    id="dataView1"
    var="rowvar"
    indexVar="objindex">
        <xe:this.value<![CDATA[#{javascript:[{fields:["field01","field02"]},{fields:["field01"]}]}]]></xe:this.value>
    <xp:this.facets>
        <xp:panel
            xp:key="summary">
            <xp:repeat
                value="#{javascript:do some stuff with rowvar}" or value="#{rowvar.fields}"
                var="field"
                indexVar="index"
                id="repeat1"
                repeatControls="true"
                rows="30">
                <xp:panel>
                    <xp:inputText
                        id="inputText1">
                        <xp:this.value><![CDATA[${javascript:
                                 var fieldName = "field0" + index;
                                 return '#{obj.' + fieldName + '}';}]]>
                        </xp:this.value>
                    </xp:inputText>
                </xp:panel>
            </xp:repeat>
        </xp:panel>
    </xp:this.facets>
</xe:dataView>

当我尝试在重复控件的 value="#{}" 中使用 rowvar 时,我收到了 [Reference] 'rowvar' not found 错误。如果我删除 repeatControls="true",我将无法再访问我的计算值绑定中的索引变量...有人对此有解决方案吗?

毫不奇怪,这是 Tim Tripcony 解释过的事情 http://avatar.red-pill.mobi/tim/blog.nsf/d6plinks/TTRY-9CD3JN。 DataView 与 Panel 一样,在其自身之后是 "cleaning up"。因此,当它在部分刷新后恢复视图时,它会删除所有指向变量 rowvar.

的 requestScope 指针

因为它是一个可编辑控件的值属性,所以最早在ApplyRequestValues阶段需要它。

也许可以使用 Tony McGuckin 的 XSnippet http://openntf.org/XSnippets.nsf/snippet.xsp?id=xrpl-isphase-api。这将允许您识别阶段并在设置 requestScope 变量(因此不为空)之后但在您的代码需要它之前的阶段计算代码。 (警告: 我没有测试过是否在需要之前设置了 requestScope 变量。)

repeatControls="true" 删除重复,因此您的代码不能再使用 rowvar。

更新

既然我测试了您正在尝试的那种东西,我意识到它失败了页面加载,而不是部分刷新。同样,这是一个时间问题。

使用 repeatControls="true",您告诉 XPage 在绑定到第一个 x[ 的 "Page Load" 事件中加载 x 行=49=]元素。因此它将设置 index,重复的 indexVar,因为它迭代数据以创建 x 行。

但是数据Table具有(并且只能具有)动态绑定。因此,在 "Page Load" 事件期间,所有组件树正在创建的是一个模板,用于将内容加载到给定行中。它没有查看数据 Table 的基础数据。它只会在渲染响应阶段迭代它。所以rowvar,DataTable的indexVar还没有设置。没有 "row" 的概念,只有一个抽象模板用于在渲染响应期间需要加载到每一行的内容。

从 Java 的角度来看,可以把它想象成试图从 Class 中获取 属性 的值(从 Class) 而不是从 Class.

实例 获取 属性 的值

唯一的方法是将数据 Table 更改为重复控件,并在外部和内部重复上设置 repeatControls="true"。然后所有内容都将在页面加载时构建,而不是在页面加载时重复,而数据 Table 在渲染响应期间重复。