ServiceNow客户端脚本异步查询,以在新的服务门户中停止提交onSubmit

时间:2016-09-30 20:47:08

标签: javascript asynchronous servicenow

我有一个客户端脚本执行GlideRecord查询以检查是否已存在具有相同名称的记录。

如果找到匹配的记录,我们需要停止提交表单。

我们在CMS门户网站上运行良好。

但是,新的服务门户不支持同步GlideRecord查询。

所以我不能使用gr.query()我需要使用一个回调,比如gr.query(回调)。

问题在于,由于回调是异步的,因此实际上并不会停止提交表单!

g_form.submitted = false;不工作。这是因为脚本在回调有机会检索值之前继续提交表单。

我们如何根据异步回调返回的值停止提交表单?出于同样的原因我们不能使用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;
    }
}

2 个答案:

答案 0 :(得分:1)

我们在赫尔辛基补丁5上,所以我们正在经历类似的成长痛苦。我们使用以下结构运气好。仍有Glide System资源可用服务器端,包括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中的某些操作。

答案 1 :(得分:0)

我能够通过使用滑动记录查询的asyc回调来解决这个问题。

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