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>