Почему моего параметра массива нет в POST-запросе?

#javascript #jquery

#javascript #jquery

Вопрос:

В приложении laravel 5.7 / jquery 3 я сохраняю массив данных и терплю неудачу, так как в консоли моего браузера я вижу, что при отправке формы в POST-запросе отправляется только параметр _token:

 let todos_count = $("#todos_count").val()
// alert( "saveTodoDialog todos_count::" var_dump(todos_count)   "  csrf_token::" csrf_token )

let todosList = [];
for (let i = 0; i < todos_count; i  ) {
    let todoItem = []
    todoItem['modified'] = $("#modified_"   i).val();
    todoItem['todo_text'] = $("#todo_text_"   i).val();
    todoItem['todo_priority'] = $("#todo_priority_"   i).val();
    todoItem['todo_completed'] = $("#todo_completed_"   i).val();
    alert("todoItem::"   var_dump(todoItem))
    todosList[todosList.length] = todoItem
}

console.log("todosList::")
console.log(todosList)
alert(todosList.length   "todosList::"   var_dump(todosList))

let href = "/admin/save-todo-page";
$.ajax({
    type: "POST",
    dataType: "json",
    url: href,
    data: {"_token": csrf_token, "todosList": todosList},
    success: function (response) {
        popupAlert("Todo items were saved successfully !", 'success')
    },
    error: function (error) {
        popupErrorMessage(error.responseJSON.message)
    }
});
  

Мой массив todosList заполнен правильно :

но это не POST-запрос. Почему?

Спасибо!

Ответ №1:

JavaScript, в отличие от PHP, имеет очень строгое поведение для массивов, поскольку они всегда проиндексированы числовым методом.

В вашем коде у вас есть:

 let todoItem = []
todoItem['modified'] = $("#modified_"   i).val();
  

Это недопустимо, потому что у вас есть массив, но вы пытаетесь использовать его как объект. Это просто создаст пользовательские свойства для объекта array, но фактически ничего не добавит к базовому массиву. Это должно быть очевидно в консоли, где ваш todosList массив представляет собой массив из 3 массивов длиной 0.

Вы можете заставить это работать, выполнив:

 let todosList = [];
for (let i = 0; i < todos_count; i  ) {
    let todoItem = {
        modified: $("#modified_"   i).val(),
        todo_text: $("#todo_text_"   i).val(),
        todo_priority: $("#todo_priority_"   i).val(),
        todo_completed: $("#todo_completed_"   i).val()
    }; //Object initialiser
    todosList.push(todoItem);
}
  

Остальной код должен работать как есть