Xpages xp:在xe:dataView内重复

Xpages xp:在xe:dataView内重复,xpages,xpages-extlib,Xpages,Xpages Extlib,我目前在xe:dataView中使用xp:repeat时遇到一些问题 场景:我正在使用一个xe:dataview,它重复一些对象(相同类型)并在表单中显示它们,但其中一些对象包含的字段比其他对象多。因此,我必须创建字段,并使用xp:repeat动态绑定值 我的问题:我无法使用我的数据视图的var=“rowvar”来计算重复控件的值=”。但是我需要在当前行中的obj上有一个引用来计算字段 这里是我的代码的一个简单版本(在我的真实场景中,obj是一个Java模型对象): 当我尝试在重复控件的va

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

场景:我正在使用一个
xe:dataview
,它重复一些对象(相同类型)并在表单中显示它们,但其中一些对象包含的字段比其他对象多。因此,我必须创建字段,并使用
xp:repeat
动态绑定值

我的问题:我无法使用我的数据视图的
var=“rowvar”
来计算重复控件的值=”。但是我需要在当前行中的obj上有一个引用来计算字段

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



当我尝试在重复控件的
value=“#{}”
内使用
rowvar
时,我得到一个
[Reference]“rowvar”未找到的
错误。如果删除
repeatControls=“true”
我将无法再访问计算值绑定中的索引变量。。。有人找到了解决办法吗?

毫不奇怪,蒂姆·特里普科尼已经解释过了。DataView就像一个面板一样,正在自我“清理”。因此,当它在部分刷新后恢复视图时,它将删除所有指向变量
rowvar
的requestScope指针

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

也许可以使用Tony McGuckin的XSnippet。这将允许您在设置requestScope变量之后(因此不为null),但在代码需要它之前,识别阶段并在阶段计算代码。(警告:我没有测试requestScope变量是否在需要之前设置好。)

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

更新

现在我测试了你正在尝试的东西,我意识到它在页面加载上失败了,而不是在部分刷新中。再说一次,这是一个时机问题

使用
repeatControls=“true”
,您告诉XPage在绑定到前x个元素的“页面加载”事件中加载x行。因此,它将设置repeat的
index
,即
indexVar
,因为它正在迭代数据以创建x行

但是数据表具有(并且只能具有)动态绑定。因此,在“页面加载”事件期间,组件树创建的所有内容都是一个模板,用于加载到给定行中的内容。它没有查看数据表的底层数据。它将仅在渲染响应阶段迭代该过程。因此,
rowvar
,尚未设置数据表的indexVar。没有“行”的概念,只有一个抽象模板,用于在渲染响应期间需要加载到每行中的内容

从Java的角度来看,将其视为试图从类(从该类创建的每个对象的模板)获取属性值,而不是从类的实例获取属性值


唯一的解决方法是将数据表更改为Repeat控件,并在外部和内部Repeat上设置
repeatControls=“true”
。然后,所有内容都将在页面加载时生成,而不是在页面加载时重复生成,并在呈现响应期间生成数据表。

毫不奇怪,这是Tim Tripcony解释的。DataView就像一个面板一样,正在自我“清理”。因此,当它在部分刷新后恢复视图时,它将删除所有指向变量
rowvar
的requestScope指针

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

也许可以使用Tony McGuckin的XSnippet。这将允许您在设置requestScope变量之后(因此不为null),但在代码需要它之前,识别阶段并在阶段计算代码。(警告:我没有测试requestScope变量是否在需要之前设置好。)

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

更新

现在我测试了你正在尝试的东西,我意识到它在页面加载上失败了,而不是在部分刷新中。再说一次,这是一个时机问题

使用
repeatControls=“true”
,您告诉XPage在绑定到前x个元素的“页面加载”事件中加载x行。因此,它将设置repeat的
index
,即
indexVar
,因为它正在迭代数据以创建x行

但是数据表具有(并且只能具有)动态绑定。因此,在“页面加载”事件期间,组件树创建的所有内容都是一个模板,用于加载到给定行中的内容。它没有查看数据表的底层数据。它将仅在渲染响应阶段迭代该过程。因此,
rowvar
,尚未设置数据表的indexVar。没有“行”的概念,只有一个抽象模板,用于在渲染响应期间需要加载到每行中的内容

从Java的角度来看,将其视为试图从类(从该类创建的每个对象的模板)获取属性值,而不是从类的实例获取属性值


唯一的解决方法是将数据表更改为Repeat控件,并在外部和内部Repeat上设置
repeatControls=“true”
。然后,所有内容都将在页面加载时生成,而不是在页面加载时重复生成,并在呈现响应期间生成数据表。

毫不奇怪,这是Tim Tripcony解释的。数据视图,比如
<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>