Используя SharePoint PreSaveAction()
, который срабатывает при нажатии кнопки Сохранить, я пытаюсь выполнить проверки и манипулировать полями до сохранения формы.Если PreSaveAction()
возвращает true
, форма будет сохранена и закрыта.
function PreSaveAction() {
var options = {
"url": "https://example.com/_api/web/lists/getbytitle('TestList')/items",
"method": "GET",
"headers": {
"Accept": "application/json; odata=verbose"
}
}
$.ajax(options).done(function (response) {
var actualHours = response.d.results[0].ActualHours
var personalHours = $("input[title$='Personal Hours']").val();
var regex = /^\d*\.?\d+$/ // Forces digit after decimal point
if (personalHours && regex.test(personalHours)) { // Run if input is not blank and passes RegEx
if (response.d.results[0].__metadata.etag.replace(/"/g, "") == $("td .ms-descriptiontext")[0].innerText.replace("Version: ", "").split('.')[0]) {
// Run if item's data from REST matches version shown in form
addChildItem(id, title, personalHours, actualHours)
}
}
});
return true; // firing before request above begins
}
Функция возвращается как true перед выполнением вызова jQuery AJAX, который запускает addChildItem()
, который управляет полями внутри формы иотправляет соответствующие данные в отдельный список.
function addChildItem(id, title, personalHours, actualHours) {
$.ajax({
method: "POST",
url: "https://example.com/_api/web/lists/getbytitle('ChildList')/items",
data: JSON.stringify({
__metadata: {
'type': 'SP.Data.ChildListListItem'
},
ParentID: id,
Title: title,
HoursWorked: personalHours
}),
contentType: "application/json;odata=verbose",
headers: {
"Accept": "application/json; odata=verbose",
},
success: function (data) {
console.log("success", data);
var actualHoursNum = Number(actualHours);
var personalHoursNum = Number(personalHours);
$("input[title$='Actual Hours']").val(actualHoursNum + personalHoursNum);
$("input[title$='Personal Hours']").val('');
// Input is getting cleared on save but shows previous number when form is opened again
},
error: function (data) {
console.log("error", data);
}
});
}
Это заставляет форму принимать манипуляции со значениями поля, но только после сохранения и до автоматического закрытия формы.
Мне нужноPreSaveAction()
ждать, пока addChildItem()
не вернется, чтобы вернуть true
, но я не уверен, как это сделать.Я попытался использовать глобальную переменную с именем returnedStatus
, которая обновляется при успешном выполнении addChildItem()
, но возвращаемое значение в PreSaveAction()
по-прежнему просматривается до запуска вызова jQuery AJAX.
Как решить проблемуэто?