ServiceNow 客户端脚本异步查询以停止在新服务门户中提交 onSubmit
ServiceNow Client Script asynchronous query to stop submission onSubmit in new Service Portal
我有一个执行 GlideRecord 查询的客户端脚本,以检查是否已存在同名记录。
如果找到匹配的记录,我们需要停止提交表单。
我们在 CMS 门户上运行良好。
但是,新的服务门户不支持同步GlideRecord查询。
所以我不能使用 gr.query() 我需要使用回调,例如 gr.query(callback).
问题在于,由于回调是异步的,它实际上并没有阻止提交表单!
g_form.submitted = 假;不工作。这是因为脚本在回调有机会检索值之前继续提交表单。
如何根据异步回调返回的值停止提交表单?出于同样的原因,我们不能使用 GlideAjax,不再支持 getXMLWait()。
这是我尝试在新服务门户中运行的客户端脚本。
function onSubmit() {
var group_name = g_form.getValue('u_group_name');
g_form.hideAllFieldMsgs('error');
/*Check if group already exists*/
var rec = new GlideRecord('u_auth_group');
rec.addQuery('u_group_name', u_group_name);
rec.query(getAccountResponse);
}
function getAccountResponse(rec) {
while (rec.next()) {
g_form.showFieldMsg('u_group_name', " Group Name exists already, please select another group name",'error');
g_form.submitted = false; //DOES NOT STOP THE FORM FROM BEING SUBMITTED
return false;
}
}
这是在 CMS 门户中运行的现有脚本。
function onSubmit() {
var group_name = g_form.getValue('u_group_name');
g_form.hideAllFieldMsgs('error');
/*Check if group already exists*/
var rec = new GlideRecord('u_auth_group');
rec.addQuery('u_group_name', u_group_name);
rec.query(getAccountResponse);
while (rec.next()) {
g_form.showFieldMsg('u_group_name', " Group Name exists already, please select another group name",'error');
g_form.submitted = false; //Stops the form from being submitted if a result is returned
return false;
}
}
我们正在使用赫尔辛基补丁 5,所以我们正在经历类似的成长烦恼。我们很幸运地使用了以下结构。服务器端仍有可用的 Glide 系统资源,包括 Glide Record。
您可以尝试将您的提交操作包装在自定义事件处理程序中。
尝试:
客户端:
c.createGroup = function(groupName){
return c.server.get({
grpname : groupName
}.then(function(response){
if (response.data.result == true){
//don't submit
}
else{
//submit
}
}
服务器端
data.result = false
data.grpname = input.grpname
function checkGroupExists(data.grpname){
/*Check if group already exists*/
var rec = new GlideRecord('u_auth_group');
rec.addQuery('u_group_name', data.grpname);
rec.limit(1); //you only need to find one match
rec.query()
while (rec.next()){
data.result = true
}
}
然后您可以将此事件处理程序绑定到 UI 中的某个操作。
我能够通过对 gliderecord 查询使用异步回调来解决这个问题。
function onSubmit() {
//If ServicePortal
if (!window) {
if (g_scratchpad.isFormValid) {
return true;
}
g_form.hideAllFieldMsgs("error");
var actionName = g_form.getActionName();
//Group Name contain letters numbers and dashes only
var group_name = g_form.getValue("u_group_name");
//Group name regular expression
var regGrpName = /^([A-Za-z0-9\-]+)$/;
//Check name against regular expression
validGroupName = regGrpName.test(group_name);
//Check if google group already exists
var gg = new GlideRecord("u_system_group");
gg.addQuery("u_group_name", group_name);
//Callback function to control stop submit asynchronously
gg.query(function() {
while (gg.next()) {
g_form.showFieldMsg("u_group_name","Group Name " + gg.u_group_name + " already exists! Please enter a different group name.", "error", true);
return false;
}
g_scratchpad.isFormValid = true;
g_form.submit(actionName);
});
return false;
}
}
我有一个执行 GlideRecord 查询的客户端脚本,以检查是否已存在同名记录。
如果找到匹配的记录,我们需要停止提交表单。
我们在 CMS 门户上运行良好。
但是,新的服务门户不支持同步GlideRecord查询。
所以我不能使用 gr.query() 我需要使用回调,例如 gr.query(callback).
问题在于,由于回调是异步的,它实际上并没有阻止提交表单!
g_form.submitted = 假;不工作。这是因为脚本在回调有机会检索值之前继续提交表单。
如何根据异步回调返回的值停止提交表单?出于同样的原因,我们不能使用 GlideAjax,不再支持 getXMLWait()。
这是我尝试在新服务门户中运行的客户端脚本。
function onSubmit() {
var group_name = g_form.getValue('u_group_name');
g_form.hideAllFieldMsgs('error');
/*Check if group already exists*/
var rec = new GlideRecord('u_auth_group');
rec.addQuery('u_group_name', u_group_name);
rec.query(getAccountResponse);
}
function getAccountResponse(rec) {
while (rec.next()) {
g_form.showFieldMsg('u_group_name', " Group Name exists already, please select another group name",'error');
g_form.submitted = false; //DOES NOT STOP THE FORM FROM BEING SUBMITTED
return false;
}
}
这是在 CMS 门户中运行的现有脚本。
function onSubmit() {
var group_name = g_form.getValue('u_group_name');
g_form.hideAllFieldMsgs('error');
/*Check if group already exists*/
var rec = new GlideRecord('u_auth_group');
rec.addQuery('u_group_name', u_group_name);
rec.query(getAccountResponse);
while (rec.next()) {
g_form.showFieldMsg('u_group_name', " Group Name exists already, please select another group name",'error');
g_form.submitted = false; //Stops the form from being submitted if a result is returned
return false;
}
}
我们正在使用赫尔辛基补丁 5,所以我们正在经历类似的成长烦恼。我们很幸运地使用了以下结构。服务器端仍有可用的 Glide 系统资源,包括 Glide Record。
您可以尝试将您的提交操作包装在自定义事件处理程序中。
尝试:
客户端:
c.createGroup = function(groupName){
return c.server.get({
grpname : groupName
}.then(function(response){
if (response.data.result == true){
//don't submit
}
else{
//submit
}
}
服务器端
data.result = false
data.grpname = input.grpname
function checkGroupExists(data.grpname){
/*Check if group already exists*/
var rec = new GlideRecord('u_auth_group');
rec.addQuery('u_group_name', data.grpname);
rec.limit(1); //you only need to find one match
rec.query()
while (rec.next()){
data.result = true
}
}
然后您可以将此事件处理程序绑定到 UI 中的某个操作。
我能够通过对 gliderecord 查询使用异步回调来解决这个问题。
function onSubmit() {
//If ServicePortal
if (!window) {
if (g_scratchpad.isFormValid) {
return true;
}
g_form.hideAllFieldMsgs("error");
var actionName = g_form.getActionName();
//Group Name contain letters numbers and dashes only
var group_name = g_form.getValue("u_group_name");
//Group name regular expression
var regGrpName = /^([A-Za-z0-9\-]+)$/;
//Check name against regular expression
validGroupName = regGrpName.test(group_name);
//Check if google group already exists
var gg = new GlideRecord("u_system_group");
gg.addQuery("u_group_name", group_name);
//Callback function to control stop submit asynchronously
gg.query(function() {
while (gg.next()) {
g_form.showFieldMsg("u_group_name","Group Name " + gg.u_group_name + " already exists! Please enter a different group name.", "error", true);
return false;
}
g_scratchpad.isFormValid = true;
g_form.submit(actionName);
});
return false;
}
}