JavaScript 在 Form Onchange 中触发了两次

JavaScript triggered twice in Form Onchage

当我想改变状态时,我使用 Javascript 来触发流程。一切正常,但是 JavaScript 函数在我更改记录状态时触发了两次。

我认为问题出在保存方面。

storno=function (executionContext)
{
 var functionName = "storno";
 var formContext = executionContext.getFormContext();
 if(formContext.getAttribute("statecode").getValue() == 3)
 { 
  //try{
   var data= {"id": ""};
   data.id = formContext.data.entity.getId();
   var requestUrl = "https://prod-78.westeurope.logic.azure.com:443/workflows/6bff2c7051424e00b8519160db83c1bf/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=sfSBGx1gP3WzU1x7XMY64WVFc_RJ6EBMadIBnNudKR4";
   var req = new XMLHttpRequest();
   req.open("POST",requestUrl,true);
   req.setRequestHeader("Accept","application/json");
   req.setRequestHeader("Content-Type","application/json; charset=utf-8");
   req.setRequestHeader("OData-MaxVersion","4.0");
   req.setRequestHeader("OData-Version","4.0");
   req.onreadystatechange = function(){
    if(this.readyState == 4 || this.readyState == 2){
     req.onreadystatechange = null;
    
     if (this.status == 200 || this.status == 204 || this.status == 202){
      formContext.data.refresh(true);
         Xrm.Utility.openEntityForm(formContext.data.entity.getEntityName(),formContext.getAttribute("description").getValue());
      
     }
     //else{
     // var error = JSON.parse(this.response).error;
     //}
    }
   };
   req.send(JSON.stringify(data)); 
  //}
  //catch(ex){
  //Obj_RunFlow.throwError(functionName,ex.massage);
  //}
 }
  
};

我可以加我的 2 美分吗?

为什么您要通过 Javascript 而现在通过 CDS 连接器启动流程。

如果您使用 Javascript 启动您的流程,它只会在用户与按钮交互时触发。如果某些后台逻辑或某些其他插件更改了记录(状态),您的流程将不会触发。

要使您的流程 运行 在任何情况下都发生状态变化,请通过后台逻辑的用户交互进行,

我希望 运行通过 CDS 连接器和 when Record is updated 连接您的流程,并过滤掉您的字段,使其仅包含状态。

这样您的流程将仅在状态字段更改时自动触发。

这个问题你解决了吗?我遇到了同样的问题,即 OnChange 事件函数被触发了两次,我确实设法解决了它,希望这能有所帮助

我注意到这种情况仅在记录创建后立即发生,并且以 UPDATE 类型重新加载。

似乎问题的发生是因为 onChange 事件处理程序没有被正确清除(可能是产品缺陷)因此添加了两次并触发了两次。

我已经能够通过添加一个函数来避免这种情况,该函数在 Form OnLoad 中添加 OnChange 函数,这允许您在要将函数附加到 OnChange 事件时进行处理。类似于此:

FNS = {
OnLoadMain: function (executionContext) {
    try {
        
        FNS.OnChangeEvents(executionContext);
    }
    catch (ex) {
        var alertStrings = {
            text: "Function : OnLoadMain" + ex.message.toString()
        };
        Xrm.Navigation.openAlertDialog(alertStrings);
    }
},
OnChangeEvents: function (executionContext) {
    try {
        var formContext = executionContext.getFormContext();
        if (formContext.ui.getFormType() !== 1) {
        
            formContext.getAttribute("statuscode").addOnChange(function (executionContext) { //Status on change only upon update to prevent event from being added twice (product bug)

                //do you stuff here
            });
        }

    } catch (ex) {
        var alertStrings = {
            text: "Function : OnChangeEvent" + ex.message.toString()
        };
        Xrm.Navigation.openAlertDialog(alertStrings);
    }
},
}

唯一剩下的就是将事件处理程序放在窗体下