XPage中computeWithForm="onsave"未触发表单计算问题咨询
你的computeWithForm理解偏差&LotusScript逻辑复用方案
嘿,你确实搞错了computeWithForm="onsave"的作用——这个属性完全不会触发表单的LotusScript QuerySave事件,它的功能仅限让Domino在保存时,用关联表单的字段公式(比如输入校验规则、计算字段值、默认值公式这类)来处理文档,和表单里的LotusScript事件逻辑半毛钱关系都没有。
为啥你的表单逻辑没跑起来?
传统Notes表单的LotusScript事件(QuerySave、PostSave这些)只有两种触发场景:
- 在Notes客户端里,由客户端程序触发执行;
- 用传统Domino Web表单提交时,由Domino的Web引擎触发;
但XPages的保存流程是一套独立的生命周期模型,和传统Web表单完全不搭,所以哪怕你设置了computeWithForm,这些LotusScript事件也不会被触发,这就是问题的核心。
针对现有大量LotusScript的解决办法
既然你不想重写一堆代码,给你两个可行方向:
1. 逐步迁移到XPages数据源事件
把表单QuerySave里的LotusScript代码,挪到XPage数据源的querySaveDocument服务器端事件里。虽然要花点时间调整,但这是最贴合XPages架构的长期方案,后续维护也省心。
迁移时的小技巧:
- XPages里可以通过
document1.getDocument()拿到后端NotesDocument实例,和原LotusScript的对象模型几乎一致,大部分代码直接就能复用,只需要微调少量上下文相关的逻辑; - 把通用逻辑封装成LotusScript脚本库,在XPages里直接调用,能减少重复劳动。
2. 手动触发计算+调用原有逻辑(折中方案)
如果暂时不想大动代码,可以在XPages的querySaveDocument事件里,先手动调用后端文档的computeWithForm完成字段计算,再调用原有的LotusScript逻辑。比如用SSJS写的话:
// 在querySaveDocument服务器端事件中执行 var backendDoc = document1.getDocument(); // 先执行表单的字段计算(和computeWithForm="onsave"效果一致) backendDoc.computeWithForm(true, false); // 调用封装在脚本库里的原QuerySave逻辑 var saveLogicLib = session.getScriptLibrary("原QuerySave脚本库"); saveLogicLib.runSaveChecks(backendDoc, session); // 最后保存文档(如果数据源已经设置自动保存,注意调整避免重复保存) backendDoc.save(true, false);
注意:这种方法只是权宜之计,原QuerySave里的一些UI相关对象在XPages环境里不存在,可能得调整代码适配。
额外提醒:如果你的表单还有字段级的LotusScript验证(比如字段的Input Validation事件),同样不会被
computeWithForm触发,要么迁移到XPages的字段验证事件,要么用类似方法手动调用。
内容的提问来源于stack exchange,提问作者MaMaRo N0
相关产品推荐
相关产品推荐

