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

时间:2016-05-13 21:25:55

标签: microsoft-dynamics dynamics-crm-2015 dynamics-crm-2016

我试图获得"获取产品"当表单处于更新模式时,主Invoice表单中的功能区操作逻辑将自动执行。

发票是通过业务流创建的,该业务流以商机开头。

这里的代码构成发票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,创建),当我填写必填字段并保存时,表单会在更新模式下重新加载,然后&#34 ;获取产品"弹出窗口出现。

问题在于通过业务流创建发票。发票表单以创建模式打开(通过业务流程,所有必填字段已填写),当我按Ctrl-S时,上面的代码被触发,表单处于更新模式,但随后又发生了另一次刷新,然后上面的代码没有运行。

我必须按F5才能再次触发它。

之前有没有人尝试这样的事情?

感谢。

1 个答案:

答案 0 :(得分:1)

最新版本的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(“自动保存”),则会自动保存(您可以在系统范围内或在您的表单上专门禁用[搜索preventAutoSave的sdk] )
  • 如果cancelSave的控制台输出显示2(“保存并关闭”),那么表单上的某些内容可能会导致导航(启用自动保存时,导航远离包含未保存数据的表单使用模式2)触发保存

如果您确定它是一个干扰的保存事件但由于某种原因无法确定保存的来源,那么您还可以采取方法确定哪些表单字段是脏的。如果没有脏字段,保存事件不会执行任何操作,因此如果您能够找出并解决肮脏问题,那么这将解决问题。查看哪些字段是脏的一种简单方法是启用对实体的审核,然后查看审核日志以查看哪些字段已通过保存更改。

相关问题