0

我在 Dynamics CRM 中有一个 Web 资源,我试图在其中添加逻辑以在保存时执行。我正在使用该addOnSave()方法将我的逻辑附加到保存中。当我在保存逻辑中使用 Promise 时,保存并关闭会在保存完成之前退出页面。如何在关闭 Web 资源之前让我的保存逻辑完全执行?

伪代码

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);
    });
  });
});
4

1 回答 1

3

您想取消保存然后重新发出它,如下所示:

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 中的功能区工作台覆盖保存并关闭按钮以指向可能如下所示的自定义函数:

function customSaveAndClose() {
  if (customSaveIsNeeded) {
    // execute your custom code
  } else {
    Xrm.Page.data.entity.save('saveandclose');
  }
}

您肯定可以在应用程序功能区级别覆盖 S&C 按钮,这将为所有实体覆盖它,但我相信您一次也可以只为一个实体覆盖它。

如果您不想弄乱编辑功能区(如果您以前从未做过,这有点吓人)并且如果您对不受支持的自定义项没有严格的要求,您还可以采取更简单的方法来简单地覆盖Mscrm.RibbonActions.saveAndCloseForm 函数,这是本机 S&C 按钮调用的函数。看起来像这样:

// defined in /_static/_common/scripts/RibbonActions.js
Mscrm.RibbonActions.saveAndCloseForm = function() {
   // your code here
}

关于这种方法的一些注意事项:

  • 它不受支持,可能会因任何更新而中断
  • CRM 表单由多个框架组成,因此如果您在自定义脚本中定义该函数并且它没有被执行,请将您的定义更改为top.Mscrm而不是仅Mscrm.
  • 如果您必须支持移动客户端,您可能应该避免这种方法并改用功能区按钮。
于 2017-08-29T20:26:06.793 回答