XPages脏表单监控无警告问题排查:是否仅支持Domino文档绑定?
XPages输入字段变更警告不触发的排查与解答
首先明确一点:变更警告功能并不是只支持Domino文档数据绑定,不过它的生效逻辑确实和你用的数据源、配置方式以及操作触发方式密切相关。你遇到的刷新/导航时无警告的问题,大概率是下面几个环节出了问题,咱们逐一排查:
全局与控件的变更跟踪开关没开
XPages的变更警告需要两个层面的配置:- 页面级:确保你的XSP页面根标签
<xp:view>设置了warnOnUnsaveChanges="true",这是全局开启警告的总开关; - 控件级:每个需要跟踪的输入控件(比如你的firstname字段),要确保
trackChanges="true"(这个属性默认是true,但如果被手动修改过就会失效)。
你可以打开页面的源码视图,检查这两个属性是否正确配置。
- 页面级:确保你的XSP页面根标签
非Domino数据源未实现变更检测接口
如果你的输入字段绑定的不是Domino文档(比如自定义JavaBean、requestScope变量这类),那这个数据源对象必须实现com.ibm.xsp.model.DataObject接口,并且正确实现isDirty()方法——XPages正是通过这个方法来判断数据是否发生了变更。如果你的自定义对象没做这个实现,XPages没法感知到内容变化,自然不会弹出警告。刷新/导航的触发方式不触发默认警告
这里分两种情况:- 局部刷新:如果你的刷新按钮用的是局部刷新(
partialRefresh属性设为true),XPages默认不会触发变更警告。这种情况下你需要手动在按钮的客户端点击事件里添加检查逻辑,比如:if(XSP.isDirty()){ if(!confirm("你有未保存的更改,确定要继续吗?")){ return false; // 阻止刷新操作 } } - 自定义导航/刷新:如果是用普通链接(
xp:link直接跳URL)或者客户端脚本导航,XPages的默认警告也不会自动触发,同样需要手动调用XSP.isDirty()来做前置检查。只有用XPages自带的导航逻辑(比如按钮的action属性设置为导航到其他页面、或者配置了navigationRule),才会自动触发变更警告。
- 局部刷新:如果你的刷新按钮用的是局部刷新(
客户端脚本干扰了默认逻辑
最后排查一下页面上有没有自定义的客户端脚本,比如覆盖了beforeunload事件(浏览器的页面卸载事件)——XPages的变更警告正是基于这个事件实现的,如果你的脚本覆盖了这个事件却没保留原逻辑,也会导致警告失效。
内容的提问来源于stack exchange,提问作者Malin
相关产品推荐
相关产品推荐

