You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xpages Repeat控件结合SSJS的历史记录展示异常求助

问题分析与解决方案

你遇到的问题核心是没有正确利用Repeat控件的row变量,反而在计算字段里重新遍历了整个History数组,导致所有日期被打包成一个数组返回,XPages默认会把数组转成逗号分隔的字符串,所以全部挤在了一行。

错误原因拆解

你的Repeat控件已经设置了value="#{document1.History}" var="row",这意味着每次循环时,row就代表History数组里的单个元素(比如"2024-05-20|创建|admin")。但你在计算字段里又重新获取了整个ArrDocHistory数组并遍历,把所有日期塞进test数组返回,自然会把所有日期堆在一起。

修正步骤

  1. 去掉冗余的数组遍历,直接对当前的row变量进行拆分操作
  2. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:22:30