setCancelMessage
setCancelMessage 是金蝶云苍穹开发中一个很实用的方法,主要用在插件里,当某些条件不满足,需要中断当前操作(比如保存、提交)时,向用户显示一个友好的文字提示。
📌 核心功能
-
配合
setCancel(true)使用 :该方法需要和setCancel(true)搭配,setCancel(true)负责中断操作,而setCancelMessage("提示内容")则告诉用户中断的原因。 -
提升用户体验 :通过明确的提示,让用户知道操作被阻止的具体原因(如"无法找到同步参数,请维护! "或"对不起,您无权访问此页面!"),而不是无反馈的"点不动"。
⚙️ 使用场景与示例
这个方法主要用于在操作执行前的校验事件中,比如 beforeDoOperation 或 preOpenForm。
场景一:在 beforeDoOperation 中拦截提交
假设你在点击提交前,需要校验单据状态,若校验不通过则拦截操作并给出提示。
java
@Override
public void beforeDoOperation(BeforeDoOperationEventArgs args) {
// 获取操作的名称,例如 "submit"
String opName = args.getSource().getOperateName();
// 如果是提交操作,进行自定义校验
if ("submit".equals(opName)) {
// 假设校验失败,需要中断操作
if (/* 校验失败条件, 比如单据状态不正确 */) {
// 1. 调用setCancel(true)取消本次操作
args.setCancel(true);
// 2. 调用setCancelMessage设置用户可见的提示信息
args.setCancelMessage("提交失败,当前单据状态不允许提交!");
}
}
}
场景二:在 preOpenForm 中阻止打开页面
这个方法也可以在打开界面前,用于权限拦截。比如,当用户无权访问某页面时,可以中断页面打开并提示。
java
@Override
public void preOpenForm(PreOpenFormEventArgs e) {
// 假设权限校验失败
if (/* 权限校验失败条件 */) {
// 1. 取消打开页面
e.setCancel(true);
// 2. 设置提示消息
e.setCancelMessage("对不起,您无权访问此页面!");
}
}
⚠️ 常见问题:提示不显示
一个常见的问题是,明明调用了 args.setCancelMessage("..."),但页面却没有任何提示。
-
根本原因 :这个问题通常是因为在调用
setCancelMessage()时,使用的参数对象(如args)的生命周期已结束,或它只是事件参数,不具备向前端发送指令的能力。 -
解决方案 :推荐使用视图模型(
IFormView)的showErrorNotification方法来显示错误信息。
java
@Override
public void beforeDoOperation(BeforeDoOperationEventArgs args) {
// ... 校验逻辑
if (/* 校验失败 */) {
// 1. 取消操作
args.setCancel(true);
// 2. 使用视图模型显示错误提示(推荐)
IFormView view = getView();
if (view != null) {
view.showErrorNotification("关闭失败,有任务正在执行");
}
// 3. 同时也可以调用setCancelMessage
args.setCancelMessage("关闭失败,有任务正在执行");
}
}
📚 相关方法一览
为了让你更好地了解它的"亲戚",这里整理了一些相关方法:
| 方法名 | 作用 | 备注 |
|---|---|---|
setCancel(boolean) |
取消或终止正在进行的操作。 | 通常与 setCancelMessage 配对使用。 |
showMessage(String) |
显示一条普通的悬浮消息。 | 通常会自动消失,用于非阻断性的提示。 |
showErrorNotification(String) |
显示一条红色的错误通知消息。 | 用于突出显示错误信息,需要用户手动关闭。 |
showConfirm(String) |
显示一个确认对话框。 | 需要用户点击"确定"或"取消"来继续后续操作。 |
💎 总结
总的来说,setCancelMessage 是配合 setCancel(true) 来显示取消提示的。虽然它的实现比较直观,但如果遇到提示不显示的问题,可以改用视图模型(IFormView)的 showErrorNotification 方法来替代,兼容性更好。
你是在哪个具体的事件里(比如 beforeDoOperation 还是 preOpenForm)使用这个方法遇到问题了吗?可以告诉我你的使用场景,我帮你看看具体的写法是否正确。