表单加载两次并取消我的加载事件逻辑
Form loads twice and cancels my load event logic
我正在尝试让主发票表单中的 "Get Products" 功能区操作逻辑在表单处于更新模式时自动执行。
发票是通过以商机开始的业务流程创建的。
这是发票 onLoad 事件的加载事件代码:
onFormLoad = function () {
//if we are in update mode...
if (Xrm.Page.ui.getFormType() == 2) {
//if no products are present in the list...
if (loadInvoiceProducts().length == 0) {
Mscrm.CommandBarActions.getProducts();
}
}
};
loadInvoiceProducts = function () {
//just a jQuery ajax call to the oData service... this works.
var products = oDataQuery("InvoiceDetailSet?$filter=InvoiceId/Id eq guid'" + Xrm.Page.data.entity.getId() + "'");
return products.results;
};
如果我手动创建一个新订单(表单随后处于表单模式 == 1,创建)并且当我填写必填字段并保存时,表单以更新模式重新加载,然后 "Get Products"弹出窗口出现。
问题出在通过业务流程创建发票时。发票表格以创建模式打开(通过业务流程,所有必填字段都已填写),当我按下 Ctrl-S 时,上面的代码被触发,表格处于更新模式,但随后又发生了一次刷新,然后上面的代码不是 运行.
我必须按 F5 才能再次触发它。
以前有没有人尝试过这样的事情?
谢谢。
最新版本的 CRM 具有异步表单加载和刷新功能,这很可能是您 运行 喜欢的。如您所述,当创建并保存新记录时,会再次触发 onload 。当更新和保存现有记录时,不会再次触发 onload。要了解更多信息,请添加一个取消保存的 onsave 处理程序,如下所示:
// Put this function into your script
function cancelSave(econtext) {
var eventArgs = econtext.getEventArgs();
console.log("saveMode", eventArgs.getSaveMode()); // could help you figure out why form is saving
eventArgs.preventDefault();
}
// And then put this line into your onload method
Xrm.Page.data.entity.addOnSave(cancelSave);
如果在添加处理程序后您的问题消失了,那么问题是您现有的记录正在保存,这不会像我提到的那样再次触发 onload。您需要调查表格保存的原因:
- 您是否有其他可以触发保存的代码?
- 如果
cancelSave
的控制台输出显示 70 ("AutoSave"),它是自动保存的(您可以在系统范围内禁用它或在您的表单上专门禁用 [在 sdk 中搜索 preventAutoSave
])
- 如果
cancelSave
的控制台输出显示 2 ("Save and Close"),则可能是您表单上的某些内容导致导航发生(当启用自动保存时,使用未保存的数据触发模式 2) 的保存
如果您确定是保存事件造成干扰,但由于某种原因无法弄清楚保存的来源,那么您还可以采用找出哪些表单域是脏的方法。如果没有脏字段,保存事件将不执行任何操作,因此如果您能找出并解决脏字段,就可以解决问题。查看哪些字段是脏的一种简单方法是在实体上启用审计,然后查看审计日志以查看哪些字段随保存而更改。
我正在尝试让主发票表单中的 "Get Products" 功能区操作逻辑在表单处于更新模式时自动执行。
发票是通过以商机开始的业务流程创建的。
这是发票 onLoad 事件的加载事件代码:
onFormLoad = function () {
//if we are in update mode...
if (Xrm.Page.ui.getFormType() == 2) {
//if no products are present in the list...
if (loadInvoiceProducts().length == 0) {
Mscrm.CommandBarActions.getProducts();
}
}
};
loadInvoiceProducts = function () {
//just a jQuery ajax call to the oData service... this works.
var products = oDataQuery("InvoiceDetailSet?$filter=InvoiceId/Id eq guid'" + Xrm.Page.data.entity.getId() + "'");
return products.results;
};
如果我手动创建一个新订单(表单随后处于表单模式 == 1,创建)并且当我填写必填字段并保存时,表单以更新模式重新加载,然后 "Get Products"弹出窗口出现。
问题出在通过业务流程创建发票时。发票表格以创建模式打开(通过业务流程,所有必填字段都已填写),当我按下 Ctrl-S 时,上面的代码被触发,表格处于更新模式,但随后又发生了一次刷新,然后上面的代码不是 运行.
我必须按 F5 才能再次触发它。
以前有没有人尝试过这样的事情?
谢谢。
最新版本的 CRM 具有异步表单加载和刷新功能,这很可能是您 运行 喜欢的。如您所述,当创建并保存新记录时,会再次触发 onload 。当更新和保存现有记录时,不会再次触发 onload。要了解更多信息,请添加一个取消保存的 onsave 处理程序,如下所示:
// Put this function into your script
function cancelSave(econtext) {
var eventArgs = econtext.getEventArgs();
console.log("saveMode", eventArgs.getSaveMode()); // could help you figure out why form is saving
eventArgs.preventDefault();
}
// And then put this line into your onload method
Xrm.Page.data.entity.addOnSave(cancelSave);
如果在添加处理程序后您的问题消失了,那么问题是您现有的记录正在保存,这不会像我提到的那样再次触发 onload。您需要调查表格保存的原因:
- 您是否有其他可以触发保存的代码?
- 如果
cancelSave
的控制台输出显示 70 ("AutoSave"),它是自动保存的(您可以在系统范围内禁用它或在您的表单上专门禁用 [在 sdk 中搜索preventAutoSave
]) - 如果
cancelSave
的控制台输出显示 2 ("Save and Close"),则可能是您表单上的某些内容导致导航发生(当启用自动保存时,使用未保存的数据触发模式 2) 的保存
如果您确定是保存事件造成干扰,但由于某种原因无法弄清楚保存的来源,那么您还可以采用找出哪些表单域是脏的方法。如果没有脏字段,保存事件将不执行任何操作,因此如果您能找出并解决脏字段,就可以解决问题。查看哪些字段是脏的一种简单方法是在实体上启用审计,然后查看审计日志以查看哪些字段随保存而更改。