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 在渲染响应期间重复。
我目前在 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
.
因为它是一个可编辑控件的值属性,所以最早在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 在渲染响应期间重复。