表单事件OnSave不执行Promise

时间:2017-08-29 17:27:46

标签: javascript dynamics-crm microsoft-dynamics webresource

我在Dynamics CRM中有一个Web资源,我正在尝试添加逻辑以在保存时执行。我使用addOnSave()方法将我的逻辑附加到保存。当我在保存逻辑中使用Promise时,Save&保存完成之前,关闭退出页面。如何在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);
    });
  });
});

1 个答案:

答案 0 :(得分:2)

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

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没有正确停止Save and Close事件的错误的评论:使用XrmToolbox中的Ribbon Workbench覆盖Save and Close按钮指向一个自定义函数,它可能看起来像某个东西像这样:

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
  • 如果您必须支持移动客户端,则应该避免使用此方法并改写功能区按钮。