【问题标题】:OnSave event on a custom entity form in CRM 2015 enters in a recursive triggerCRM 2015 中自定义实体表单上的 OnSave 事件进入递归触发器
【发布时间】:2015-06-18 09:54:02
【问题描述】:

我在 crm 2015 本地组织上以自定义实体的形式注册了 onSave 事件,这似乎进入了递归调用。在我点击保存后,事件继续调用它自己,直到我通过任务管理器杀死 IE 或 IE 崩溃,内存堆栈已满。我已经检查过了,它似乎与我在函数中的内容无关,这意味着我不会以任何方式再次触发 on save 事件。

功能代码如下:

function contract_OnSave(context) {

    var eventArgs = context.getEventArgs();
    if (eventArgs.getSaveMode() == 1) {

        if (Xrm.Page.getAttribute("new_field").getValue() != null) {
            var mort = Xrm.Page.getAttribute("new_field").getValue();

            if (mort == true) {


                Xrm.Utility.confirmDialog("Would you like to open a new window for a Case?",
                    saveFormOnOpenCase,
                    callback)
            }
        }
    }
}
function saveFormOnOpenCase()
{
    Xrm.Page.data.save();
    var parameters = {};
    parameters["new_subjectnew"] = 100000002;
    // Open the window.
    var windowOptions = {
        openInNewWindow: true
    };
    Xrm.Utility.openEntityForm("incident", null, parameters, windowOptions);
}
function callback() {

}

在我看来这是 CRM 2015 中的一个错误,之后我检查了 CRM 的版本,发现它是 RTM 版本。我建议将 CRM 升级到 Update 1,这似乎是最合乎逻辑的步骤。但是即使在升级之后,问题仍然存在。

我尝试在字段上的 OnChange 事件上注册相同的函数,它工作正常,除了 openEntityForm 函数的 openInNewWindow 选项,它不会打开新窗口,但这是一个不同的问题。

我使用的是 IE 11。

有人可以确认这是否也在另一个 CRM 2015 环境中发生,或者我是否遗漏了什么?

【问题讨论】:

    标签: javascript dynamics-crm-2015


    【解决方案1】:

    在 OnSave 事件中,您要求用户确认:

    Xrm.Utility.confirmDialog("Would you like to open a new window for a Case?",
                    saveFormOnOpenCase,
                    callback)
    

    当用户选择确定时,此对话框执行函数saveFormOnOpenCase。该函数执行的第一条指令是:

    Xrm.Page.data.save();
    

    ...再次触发保存事件。

    【讨论】:

    • 谢谢你的回答,它给了我一个线索。我忘记删除那个 Xrm.Page.data.save();保存表单行,我在将事件放在更改字段后放置。我会再次检查。
    • 实际的问题是,Xrm.Utility.openEntityForm("incident", null, parameters, windowOptions);在同一窗口中打开案例记录表单,而不是新的,如 MSDN 在线中所述,实际上,我相信这会触发表单的自动保存,这会导致事件递归。所以我需要使用纯 JavaScript 代码打开新窗口,而不是 sdk 代码(不能按预期工作),或者如果我可以阻止默认事件...
    【解决方案2】:

    使 OnSave 函数进入递归调用的实际问题如下:

    var windowOptions = {
        openInNewWindow: true
    };    
    Xrm.Utility.openEntityForm("incident", null, parameters, windowOptions);
    

    如链接中所述

    https://msdn.microsoft.com/en-us/library/jj602956.aspx

    openEntityForm 中的 windowOptions 参数应该在新窗口中打开新表单,但由于某种原因它不会,尽管 CRM 已使用 CRM 2015 的更新 1 进行了更新。因为表单不会在新窗口中打开,离开当前表单时,会触发自动保存事件,导致表单进入递归并启动 OnSave 事件。

    我通过使用纯 javascript 函数(不使用 CRM SDK)在新窗口中打开表单来解决此问题,这不会启动 OnSave 事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多