CRM 2015 中自定义实体窗体上的 OnSave 事件进入递归触发器
OnSave event on a custom entity form in CRM 2015 enters in a recursive trigger
我在 crm 2015 本地组织上以自定义实体的形式在 onSave 上注册了一个事件,它似乎进入了递归调用。在我点击保存后,事件一直调用它自己,直到我通过任务管理器终止 IE 或 IE 崩溃并内存堆栈已满。我已经检查过了,它似乎与我在函数中的内容无关,这意味着我不会以任何方式再次触发保存事件。
功能代码如下:
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 选项,它不会打开新的 window,但这是一个不同的问题。
我正在使用 IE 11。
有人可以确认这是否也发生在另一个 CRM 2015 环境中,或者我是否遗漏了什么?
在 OnSave 事件中你要求用户确认:
Xrm.Utility.confirmDialog("Would you like to open a new window for a Case?",
saveFormOnOpenCase,
callback)
当用户选择“确定”时,此对话框将执行功能 saveFormOnOpenCase
。该函数执行的第一条指令是:
Xrm.Page.data.save();
...再次触发保存事件
使OnSave函数进入递归调用的实际问题如下:
var windowOptions = {
openInNewWindow: true
};
Xrm.Utility.openEntityForm("incident", null, parameters, windowOptions);
如link
中所述
https://msdn.microsoft.com/en-us/library/jj602956.aspx。
openEntityForm 中的 windowOptions 参数应该在新 window 中打开新表单,但由于某些原因它没有打开,尽管 CRM 已使用 CRM 2015 的更新 1 进行了更新。因为表单不会在新的 window 中打开,当离开当前表单时,会触发自动保存事件,导致表单进入递归并启动 OnSave 事件。
我通过使用纯 javascript 函数(不使用 CRM SDK)在新 window 中打开表单解决了这个问题,它不会启动 OnSave 事件。
我在 crm 2015 本地组织上以自定义实体的形式在 onSave 上注册了一个事件,它似乎进入了递归调用。在我点击保存后,事件一直调用它自己,直到我通过任务管理器终止 IE 或 IE 崩溃并内存堆栈已满。我已经检查过了,它似乎与我在函数中的内容无关,这意味着我不会以任何方式再次触发保存事件。
功能代码如下:
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 选项,它不会打开新的 window,但这是一个不同的问题。
我正在使用 IE 11。
有人可以确认这是否也发生在另一个 CRM 2015 环境中,或者我是否遗漏了什么?
在 OnSave 事件中你要求用户确认:
Xrm.Utility.confirmDialog("Would you like to open a new window for a Case?",
saveFormOnOpenCase,
callback)
当用户选择“确定”时,此对话框将执行功能 saveFormOnOpenCase
。该函数执行的第一条指令是:
Xrm.Page.data.save();
...再次触发保存事件
使OnSave函数进入递归调用的实际问题如下:
var windowOptions = {
openInNewWindow: true
};
Xrm.Utility.openEntityForm("incident", null, parameters, windowOptions);
如link
中所述https://msdn.microsoft.com/en-us/library/jj602956.aspx。
openEntityForm 中的 windowOptions 参数应该在新 window 中打开新表单,但由于某些原因它没有打开,尽管 CRM 已使用 CRM 2015 的更新 1 进行了更新。因为表单不会在新的 window 中打开,当离开当前表单时,会触发自动保存事件,导致表单进入递归并启动 OnSave 事件。
我通过使用纯 javascript 函数(不使用 CRM SDK)在新 window 中打开表单解决了这个问题,它不会启动 OnSave 事件。