2016-07-08 3 views
0

Hier vergleiche ich 2 Variablen für Termine start_date und end_date und erlauben, das Formular nur in Fall end_date ist größer als start_date, sonst ablehnen das Formular zu übermitteln, aber Während dieser Code ausgeführt wird, geht er in die Endlosschleife und wenn ich async mit getXMLWait() anstelle von getXML (checkDateDiff) mache, wird dies nicht mit mobilen APIs unterstützt.ServiceNow: Aufruf von onSubmit in einer Callback-Funktion führt zu Endlosschleife

Auch gibt es viele Client-Skript, die beim Vergleichen von Daten helfen, aber keiner von ihnen wird mit mobilen API unterstützt.

Bitte schauen Sie sich den folgenden Code an und helfen Sie !!!!

function onSubmit() { 
    var requestType = g_form.getValue('request_type'); 
    if (requestType == 'mifi') { 
     console.log("calling validateTravelEndDate()"); 
     validateTravelEndDate(); 
     return false; 
    } else 
     return true; 
} 

//Helper function which calls a AJAX script include called "ClientDateTimeUtils" which gives the response in a callback where i am deciding whether to submit the form or not based on the status of days result. 

function validateTravelEndDate() { 
    var startDate = g_form.getValue('travel_start'); //First Date/Time field 
    var endDate = g_form.getValue('travel_end'); //Second Date/Time field 
    var dttype = 'day'; //this can be day, hour, minute, second. By default it will return seconds. 
    console.log("startDate :" + startDate + "endDate :" + endDate); 
    var ajax = new GlideAjax('ClientDateTimeUtils'); // This is the script include which can be used for date validation. 
    ajax.addParam('sysparm_name', 'getDateTimeDiff'); 
    ajax.addParam('sysparm_fdt', startDate); 
    ajax.addParam('sysparm_sdt', endDate); 
    ajax.addParam('sysparm_difftype', dttype); 
    console.log("before " + g_form.getValue('travel_end')); 
    ajax.getXML(checkDateDiff); 
} 

// callback function where deciding to go ahead or not with form submission. 
function checkDateDiff(response) { 
    var answer = response.responseXML.documentElement.getAttribute("answer"); 
console.log("difference in days:" + answer); 
    if (answer <= 0) { 
     alert("Travel End date must be after Travel Start date."); 
     g_form.setValue('travel_end', ''); 
     g_form.showFieldMsg('travel_end', 'Please provide a future date', 'error'); 
     return false; 
} else { 
     console.log("%%%%%%%%%%%%%%% Calling g_form.submit()"); 
     g_form.submit(); // This has some issue as it’s going in the infinite loop and if we just return true/false from here as it’s asynchronous call , it’s not handled by the onSubmit function 
    } 
} 

Antwort

0

Ihre onSubmit() Funktion gibt immer false für eine mifi Anfrage. onSubmit() - Funktionen können eine sichere Übermittlung ausführen, wenn sie eine true zurückgeben. Außerdem können g_form Funktionen nicht in der Callback-Funktion ausgeführt werden, da diese auf dem Server ausgeführt wird.

Anstatt eine g_form.submit() am Ende Ihrer checkDateDiff Funktion haben, onSubmit() Funktion zurückgeben true.

So etwas sollte funktionieren. Ich habe jede Zeile kommentiert, die ich geändert habe:

function onSubmit() { 
    var requestType = g_form.getValue('request_type'); 
    if (requestType == 'mifi') { 
     console.log("calling validateTravelEndDate()"); 

     // **CHANGED CODE: instead of g_form.submit(), this will return true 
     if(validateTravelEndDate()){ 
      return true; 
     } 
     else{ 
      return false; 
     } 

    } else 
     return true; 
} 

//Helper function which calls a AJAX script include called "ClientDateTimeUtils" which gives the response in a callback where i am deciding whether to submit the form or not based on the status of days result. 

function validateTravelEndDate() { 
    var startDate = g_form.getValue('travel_start'); //First Date/Time field 
    var endDate = g_form.getValue('travel_end'); //Second Date/Time field 
    var dttype = 'day'; //this can be day, hour, minute, second. By default it will return seconds. 
    console.log("startDate :" + startDate + "endDate :" + endDate); 
    var ajax = new GlideAjax('ClientDateTimeUtils'); // This is the script include which can be used for date validation. 
    ajax.addParam('sysparm_name', 'getDateTimeDiff'); 
    ajax.addParam('sysparm_fdt', startDate); 
    ajax.addParam('sysparm_sdt', endDate); 
    ajax.addParam('sysparm_difftype', dttype); 
    console.log("before " + g_form.getValue('travel_end')); 

    // **CHANGED CODE: validateTravelEndDate returns the callback value 
    return ajax.getXML(checkDateDiff); 
} 

// callback function where deciding to go ahead or not with form submission. 
function checkDateDiff(response) { 
    var answer = response.responseXML.documentElement.getAttribute("answer"); 
    console.log("difference in days:" + answer); 
    if (answer <= 0) { 
     alert("Travel End date must be after Travel Start date."); 
     g_form.setValue('travel_end', ''); 
     g_form.showFieldMsg('travel_end', 'Please provide a future date', 'error'); 
     return false; 
    } 
    else { 
    // **CHANGED CODE: checkDateDiff will return true 
     return true; 
    } 
} 
+0

Hey Danke, das hat mein Problem gelöst. –

Verwandte Themen