表单加载两次并取消我的加载事件逻辑

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)
  • 的保存

如果您确定是保存事件造成干扰,但由于某种原因无法弄清楚保存的来源,那么您还可以采用找出哪些表单域是脏的方法。如果没有脏字段,保存事件将不执行任何操作,因此如果您能找出并解决脏字段,就可以解决问题。查看哪些字段是脏的一种简单方法是在实体上启用审计,然后查看审计日志以查看哪些字段随保存而更改。