Функция возвращает значение перед выполнением внутренних действий - PullRequest
0 голосов
/ 13 марта 2019

Используя 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.

Как решить проблемуэто?

1 Ответ

1 голос
/ 14 марта 2019

Я получил аналогичный случай, установив async: false для добавления пользователя в группу в PreSaveAction.

Исходная тема

<script language="javascript" type="text/javascript">

        function PreSaveAction() {
            var check = false;
            var controlName = 'MultiUsers';
            // Get the people picker object from the page.
            var peoplePickerDiv = $("[id$='ClientPeoplePicker'][title='" + controlName + "']");
            var peoplePickerEditor = peoplePickerDiv.find("[title='" + controlName + "']");
            var peoplePicker = SPClientPeoplePicker.SPClientPeoplePickerDict[peoplePickerDiv[0].id];            
            if (!peoplePicker.IsEmpty()) {
                if (peoplePicker.HasInputError) return false; // if any error
                else if (!peoplePicker.HasResolvedUsers()) return false; // if any invalid users
                else if (peoplePicker.TotalUserCount > 0) {
                    // Get information about all users.
                    var users = peoplePicker.GetAllUserInfo();                                     
                    for (var i = 0; i < users.length; i++) {
                        console.log(users[i].Key);
                        var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/sitegroups(22)/users";
                        $.ajax({
                            url: requestUri,
                            type: "POST",
                            async: false,
                            data: JSON.stringify({ '__metadata': { 'type': 'SP.User' }, 'LoginName': '' + users[i].Key + '' }),
                            headers: {
                                "accept": "application/json;odata=verbose",
                                "content-type": "application/json;odata=verbose",
                                "X-RequestDigest": $("#__REQUESTDIGEST").val()
                            },
                            success: function(data) {
                                console.log('User Added');
                                check = true;
                            },
                            error: function (error) {
                                console.log(JSON.stringify(error));
                                check = false;
                            }
                        });                                                
                    }                    
                }
            } else {
                console.log('No user');
            }
            return check;
        }                
    </script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...