Warm tip: This article is reproduced from serverfault.com, please click

JavaScript triggered twice in Form Onchage

发布于 2020-05-27 19:23:38

I use Javascript to trigger a Flow when I want to change the state. Everything worked fine but the JavaScript function triggered two times when I change the state my record.

i think the Problem is something with the save. enter image description here enter image description here enter image description here enter image description here

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);
		//}
	}
		
};
Questioner
bnb
Viewed
0
Antonio González 2020-12-01 18:55:27

Have you resolved this issue? I was experiencing the same problem where an OnChange event function was being triggered twice, I did manage to resolve it so hopefully this helps

I noticed this happens only right after the record gets created, and the reloads in UPDATE type.

Seems like the problem happens because the onChange event handlers are not being cleared properly (maybe product defect) hence added twice and triggered twice.

I have been able to avoid this by adding a function that adds the OnChange function at the Form OnLoad, this allows you to handle when you want to attach the function to the OnChange event. Something similar to this:

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);
    }
},
}

The only thing left is to place the event handler under the Form

enter image description here