0

我在 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 环境中发生,或者我是否遗漏了什么?

4

2 回答 2

1

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

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

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

Xrm.Page.data.save();

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

于 2015-06-18T17:57:20.640 回答
0

使 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 事件的新窗口中打开表单来解决此问题。

于 2015-06-21T17:43:33.123 回答