nastya97core
@nastya97core
Начинающий программист

Как сформировать массив только тех полей, которые изменились, чтобы потом их отправить?

Здравствуйте. В админке есть таблица со списком записей из БД. У всех записей есть некоторые поля, которые можно отредактировать. Мне нужно, чтобы пользователь мог изменить поля и сохранить изменения. Как собрать массив для отправки его на сервер? То есть мне нужно собрать массив, в котором будут только те поля, которые редактировались.
Примерно так выглядит таблица:
https://jsfiddle.net/pos2yb0j/1/

А вот такой массив мне нужно получить, если у 1 записи будет изменено info на 123, а у второй записи изменён статус на value 3:
[
   {id: a1, info: '123', status: 'value 2'},
   {id: a2, status: 'value 3'},
]


Момент с которым я столкнусь:
item.addEventListener('input', function() {.отслеживает все изменения, даже если было написано: "Молоко" и я допишу "1", а потом сотру "1", то этот input всё равно сохранит эту правку и запишет её в массив. Чтобы такого не было мне нужно будет хранить в памяти содержимое всех полей и сравнивать их перед отправкой. Короче - пускай лучше перезаписывается, потому что полей действительно может быть очень много и хранить это всё в памяти не очень хочется.
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 3
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Запоминаем изначальное состояние полей
Перед отправкой берём текущее состояние
Вычисляем diff между объектами
Ответ написан
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
Мне нужно, чтобы пользователь мог изменить поля и сохранить изменения. Как собрать массив для отправки его на сервер?
Форма? Если просто из формы отправлять не позволяет религия/архитектура - в жс - формДата(форма) и отправляете аяксом.
Ответ написан
@sergiodev
По-моему надо запомнить начальное состояние (при загрузке страницы), потом при отправке формы пройтись по всем строчкам таблицы и проверить, совпадает ли значение с изначальным. Если нет - добавить соотв. запись в массив.

Что-то вроде такого:

var initialState = serialize();

function serialize() {
    var data = [];
    var rows = myTable.rows;

    for (var i = 1; i < rows.length; i++) {
        var row = rows[i];
        var id = row.cells[0].textContent;
        var info = row.cells[2].firstChild.value;
        var status = row.cells[3].firstChild.value;
        data.push({
            id: id,
            info: info,
            status: status
        });
    }

    return data;
}

function onSubmit() {
    var data = [];
    var currentState = serialize();

    for (var i = 0; i < currentState.length; i++) {
        var entry = currentState[i];
        var oldEntry = initialState.find(e => e.id == entry.id);
        if (oldEntry.state != entry.state || oldEntry.info != entry.info) {
            data.push(entry);
        }
    }

    // отправить реквест с данными из data
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы