Xpages Repeat控件结合SSJS的历史记录展示异常求助
问题分析与解决方案
你遇到的问题核心是没有正确利用Repeat控件的row变量,反而在计算字段里重新遍历了整个History数组,导致所有日期被打包成一个数组返回,XPages默认会把数组转成逗号分隔的字符串,所以全部挤在了一行。
错误原因拆解
你的Repeat控件已经设置了value="#{document1.History}" var="row",这意味着每次循环时,row就代表History数组里的单个元素(比如"2024-05-20|创建|admin")。但你在计算字段里又重新获取了整个ArrDocHistory数组并遍历,把所有日期塞进test数组返回,自然会把所有日期堆在一起。
修正步骤
- 去掉冗余的数组遍历,直接对当前的
row变量进行拆分操作 - 修正Repeat控件的HTML结构,避免重复生成
<tbody>标签(每个表格应该只有一个tbody)
完整修正代码
<table class="table table-hover"> <thead> <tr> <th>Date</th> <th>Action</th> <th>Username</th> </tr> </thead> <tbody> <!-- Repeat控件放在tbody内部,循环生成tr --> <xp:repeat value="#{document1.History}" var="row" indexVar="rowIndex"> <tr> <td> <xp:text escape="true" id="computedFieldDate"> <xp:this.value><![CDATA[#{javascript: // 直接拆分当前row对应的字符串 var parts = row.split("|"); // 返回日期部分(第一个元素) return parts.length > 0 ? parts[0] : ""; }]]></xp:this.value> </xp:text> </td> <td> <xp:text escape="true" id="computedFieldAction"> <xp:this.value><![CDATA[#{javascript: var parts = row.split("|"); return parts.length > 1 ? parts[1] : ""; }]]></xp:this.value> </xp:text> </td> <td> <xp:text escape="true" id="computedFieldUsername"> <xp:this.value><![CDATA[#{javascript: var parts = row.split("|"); return parts.length > 2 ? parts[2] : ""; }]]></xp:this.value> </xp:text> </td> </tr> </xp:repeat> </tbody> </table>
额外优化建议
- 可以把拆分逻辑封装成一个小函数,避免重复代码:
然后在计算字段里调用:function getHistoryPart(itemStr, index){ if(!itemStr) return ""; var parts = itemStr.split("|"); return parts.length > index ? parts[index] : ""; }return getHistoryPart(row, 0);(0对应日期,1对应操作,2对应用户名) - 增加长度判断是为了容错,避免History字段里出现格式错误的字符串导致页面报错。
内容的提问来源于stack exchange,提问作者Chris Richards
相关产品推荐
相关产品推荐

