【问题标题】:Form Event OnSave not executing Promise表单事件 OnSave 未执行 Promise
【发布时间】:2017-08-29 17:27:46
【问题描述】:

我在 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);
    });
  });
});

【问题讨论】:

    标签: javascript dynamics-crm microsoft-dynamics webresource


    【解决方案1】:

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

    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 按钮,这将为所有实体覆盖它,但我相信您一次也可以只为一个实体覆盖它。

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

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

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

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

    【讨论】:

    • 这对我不起作用。永远不会阻止原始的保存和关闭。我通过放入阻止代码然后从不重新发出保存来测试这一点,但屏幕仍然关闭并保存。
    • 更多研究表明这会阻止保存但不会阻止关闭。在我的 Web 资源的自定义保存完成之前,我最终遇到了表单退出的相同问题。
    • 暂时,我们删除了保存并关闭按钮,以便用户在保存后必须离开页面。我们还添加了一个弹出框来训练用户在离开之前等待保存完成。在某个时候,我们可能会回来并自定义一个按钮来执行“保存并关闭”。
    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多