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);
}
},
}
唯一剩下的就是将事件处理程序放在窗体下
当我想改变状态时,我使用 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);
}
},
}
唯一剩下的就是将事件处理程序放在窗体下