Firebase Javascript множественное удаление одним кликом - PullRequest
0 голосов
/ 07 сентября 2018

Я занимаюсь разработкой веб-страницы для управления мероприятиями и бронирования классных комнат. Для каждого события я сохраняю день, час и класс, где он будет проходить. В настоящее время я работаю над функцией удаления событий и связанных с ними резервирований.

function deleteEvent(event_key, event_date, event_classroom_key) {
    if (event_classroom_key != null) {
        var ref_prenotation = firebase.database().ref().child('prenotation/'
        + event_date.getFullYear() + '/' 
        + (event_date.getMonth() + 1) + '/' 
        + event_date.getDate() + '/' 
        + event_classroom_key + '/');

        ref_prenotation.once('value', snap => {
            snap.forEach(childSnap => {
                childSnap.forEach(gcSnap => {
                    if (gcSnap.key == 'event_key') {
                        if (event_key == gcSnap.val()) {
                            ref_prenotation.child(childSnap.key).remove();
                        }
                    }
                });
            });
        });
    }

    var event_ref = firebase.database().ref().child('event/');
    event_ref.child(event_key).remove();

    $('#event_details').hide();
    $('#main_events_page').show();
    loadEventList();
}

Как видите, для удаления бронирования из базы данных я просматриваю базу данных по годам, месяцам, дням и классам. Таким образом, я получаю информацию об индивидуальных часах, забронированных для класса в выбранную дату.

Затем я проверяю, относятся ли забронированные часы к событию, которое я хочу удалить, и в случае, если я их удаляю. Затем я удаляю саму запись события.

Каждое событие и связанные с ним бронирования генерируются, как показано ниже.

$('#create_event_btn').on('click', () => {
    var today = Date.now() - (24*3600*1000);
    user = firebase.auth().currentUser;

    if (cs_selected_rows > 0 && ne_date >= today &&  eventTitle.value != "") {
        var event_prenotation = firebase.database().ref().child('event/').push({
            title : eventTitle.value,
            classroom : classroom_name,
            classroom_key : classroom_id,
            date : ne_date.getTime(),
            teacher : user.displayName,
            teacher_key : user.uid,
            starting_hour : selected_hours[0]
        });

        //create a reservation for the selected room, unless the event takes place abroad

        if (classroom_name != "Outdoor") {
            for (var i = 0; i < selected_hours.length; i++) {            
                firebase.database().ref().child('prenotation/'+year+'/'+month+'/'+day+'/'+classroom_id+'/'+selected_hours[i]+'/').set({
                event_key : event_prenotation.key,
                event : eventTitle.value,
                classroom : classroom_name
                });
            }
        }

        loadEventList();

        selected_hours = [];
        cs_selected_rows = 0;

        $('#new_event_page').hide();
        $('#main_events_page').show();
        $("#schedule_event_table_body").empty();

    } else if (ne_date < today) {
        alert('ERROR');
    }
});

Проблема в том, что при нажатии кнопки «Удалить», связанной с событием, удаляются несколько событий, в дополнение к выбранному. Нечто подобное происходит, когда я пытаюсь изменить данные, связанные с событием, и часто случается, что изменяются данные многих других событий. Я заметил, что это происходит в основном, когда я получаю доступ к информации о событии в базе данных через сайт, ничего не меняя. Затем, когда я пытаюсь изменить или удалить другое событие, это также влияет на первое.

Я надеюсь, что предоставил полезную информацию о проблеме. Я давно не пользуюсь firebase, но думаю, что систематически делаю что-то не так, потому что со мной часто возникают проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...