2016-09-30 30 views
0

我有一個客戶端腳本執行GlideRecord查詢來檢查一個記錄是否已經存在具有相同的名稱。ServiceNow客戶端腳本異步查詢停止提交onSubmit在新的服務門戶

如果找到匹配記錄,我們需要停止提交表單。

我們在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; 
    } 
} 

回答

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; 
    } 
} 
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的一些動作。

+0

非常感謝John。你能描述一下關於如何「將事件處理程序綁定到UI中的某個動作」的最後一點嗎?我們只需要驗證表單onSubmit,以便它將成爲目錄項目或記錄製作者上的提交按鈕。謝謝! – pengz

+0

有幾種不同的方法可以在門戶網站的sc_cat_item頁面上執行此操作。您可以在HTML部分的第30行上修改提交按鈕上的ng-click綁定。或者您可以覆蓋客戶端代碼中的$ scope.triggerOnSubmit方法來添加您的邏輯。這真的取決於你的設計要求。 –