表单事件 OnSave 不执行 Promise
Form Event OnSave not executing Promise
我在 Dynamics CRM 中有一个 Web 资源,我试图在其中添加逻辑以在保存时执行。我正在使用 addOnSave()
方法将我的逻辑附加到保存。当我在保存逻辑中使用 Promise 时,保存并关闭会在保存完成之前退出页面。我怎样才能让我的保存逻辑在网络资源关闭之前完全执行?
伪代码
Xrm.Event.addOnSave(function () {
// Code makes it here
Promise.all([promises]).then(function(){
// Code never makes it here
secondPromise.then(function(){
showAlert();
setTimeout(function(){
closeAlert();
}, 5000);
});
});
});
你想取消保存然后重发,像这样:
Xrm.Page.data.entity.addOnSave(function (context) {
var eventArgs = context.getEventArgs();
eventArgs.preventDefault(); // cancels the save (but other save handlers will still run)
Promise.all([promises]).then(function(){
// Code never makes it here
secondPromise.then(function(){
showAlert();
setTimeout(function(){
closeAlert();
// reissue the save
Xrm.Page.data.entity.save('saveandclose');
}, 5000);
});
});
});
回应您对 preventDefault 无法正确停止保存和关闭事件的错误的评论:使用 XrmToolbox 中的功能区 Workbench 覆盖保存和关闭按钮以指向自定义函数这可能看起来像这样:
function customSaveAndClose() {
if (customSaveIsNeeded) {
// execute your custom code
} else {
Xrm.Page.data.entity.save('saveandclose');
}
}
您当然可以在应用程序功能区级别覆盖 S&C 按钮,这会覆盖所有实体,但我相信您一次也可以只覆盖一个实体。
如果你不想编辑功能区(如果你以前从未做过这有点吓人)并且你对不受支持的自定义没有严格的要求,你也可以采取更简单的方法简单地覆盖本机 S&C 按钮调用的 Mscrm.RibbonActions.saveAndCloseForm 函数的方法。那看起来像这样:
// defined in /_static/_common/scripts/RibbonActions.js
Mscrm.RibbonActions.saveAndCloseForm = function() {
// your code here
}
关于此方法的一些注意事项:
- 它不受支持,任何更新都可能中断
- CRM 表单由多个框架组成,因此如果您在自定义脚本中定义该函数但它没有执行,请将您的定义更改为
top.Mscrm
而不是 Mscrm
。
- 如果您必须支持移动客户端,您可能应该避免这种方法,而是覆盖功能区按钮。
我在 Dynamics CRM 中有一个 Web 资源,我试图在其中添加逻辑以在保存时执行。我正在使用 addOnSave()
方法将我的逻辑附加到保存。当我在保存逻辑中使用 Promise 时,保存并关闭会在保存完成之前退出页面。我怎样才能让我的保存逻辑在网络资源关闭之前完全执行?
伪代码
Xrm.Event.addOnSave(function () {
// Code makes it here
Promise.all([promises]).then(function(){
// Code never makes it here
secondPromise.then(function(){
showAlert();
setTimeout(function(){
closeAlert();
}, 5000);
});
});
});
你想取消保存然后重发,像这样:
Xrm.Page.data.entity.addOnSave(function (context) {
var eventArgs = context.getEventArgs();
eventArgs.preventDefault(); // cancels the save (but other save handlers will still run)
Promise.all([promises]).then(function(){
// Code never makes it here
secondPromise.then(function(){
showAlert();
setTimeout(function(){
closeAlert();
// reissue the save
Xrm.Page.data.entity.save('saveandclose');
}, 5000);
});
});
});
回应您对 preventDefault 无法正确停止保存和关闭事件的错误的评论:使用 XrmToolbox 中的功能区 Workbench 覆盖保存和关闭按钮以指向自定义函数这可能看起来像这样:
function customSaveAndClose() {
if (customSaveIsNeeded) {
// execute your custom code
} else {
Xrm.Page.data.entity.save('saveandclose');
}
}
您当然可以在应用程序功能区级别覆盖 S&C 按钮,这会覆盖所有实体,但我相信您一次也可以只覆盖一个实体。
如果你不想编辑功能区(如果你以前从未做过这有点吓人)并且你对不受支持的自定义没有严格的要求,你也可以采取更简单的方法简单地覆盖本机 S&C 按钮调用的 Mscrm.RibbonActions.saveAndCloseForm 函数的方法。那看起来像这样:
// defined in /_static/_common/scripts/RibbonActions.js
Mscrm.RibbonActions.saveAndCloseForm = function() {
// your code here
}
关于此方法的一些注意事项:
- 它不受支持,任何更新都可能中断
- CRM 表单由多个框架组成,因此如果您在自定义脚本中定义该函数但它没有执行,请将您的定义更改为
top.Mscrm
而不是Mscrm
。 - 如果您必须支持移动客户端,您可能应该避免这种方法,而是覆盖功能区按钮。