Laravel/Ajax: обновление таблицы складывает новые данные в нижней части (старые данные остаются)

#sql #ajax #laravel #duplicates #crud

Вопрос:

Я использую его fetchcategory(); для обновления таблицы всякий раз, когда пытаюсь добавлять, редактировать и удалять данные. Моя проблема в том, что каждый раз, когда таблица пытается перезагрузиться, новые обновленные данные стекаются в нижней части таблицы. Старая информация остается там, где она есть. Пример показан ниже:

1

В моей таблице есть одна существующая запись, на втором снимке экрана показан результат после добавления новых данных.

2

Как вы можете видеть, мое другое состояние под add_category триггерами. самая последняя строка кода под else — » fetchcategory ();». но функция fetch simple добавляет всю новую таблицу под данными перед обновлением. То же самое касается моей функции редактирования и удаления.

Мой вопрос в том, почему таблица просто не перезагружает все это и не удаляет отображение старых данных?

Кроме того, я хочу воздержаться от использования location.reload() , потому что я не хочу, чтобы обновлялась вся веб-страница, только таблица.

АЯКС:

  $(document).ready(function (){

        fetchcategory();

      function fetchcategory() {
            $.ajax({
                type: "GET",
                url: "/clinical/bbr-category-configuration-data",
                dataType: "json",
                success: function (response){
                    $.each(response.all_categories, function (key, cat) {
                        $('tbody').append(`
                            <tr>
                                <td><p class="font-weight-bold mb-0">${cat.category_name}</p>${cat.category_description}</td>
                                <td>View:
                                    <mark class="mark-orange">${gettype(cat.config_view_type)}</mark>
                                    <br>Edit:
                                    <mark class="mark-orange">${gettype(cat.config_edit_type)}</mark>
                                </td>
                                <td>View:
                                    <mark class="mark-orange">${gettype(cat.bbrmode_view_type)}</mark>
                                </td>
                                <td>
                                    <button type="button" value="${cat.category_id}" class="edit_category btn btn-outline-secondary"><i class="fas fa-edit"></i> Edit</button>
                                    <button type="button" value="${cat.category_id}" class="delete_category btn btn-outline-secondary"><i class="fas fa-trash"></i> Delete</button>
                                </td>
                            </tr>`);
                    });

                    function gettype(type) {
                        var c_type = '';
                        if (type == 'P') {
                            c_type = 'Public'
                        } else if (type == 'R') {
                            c_type = 'Restricted'
                        } else if (type == undefined){
                            c_type = 'N/A'
                        }
                        return c_type;
                    }

                }
            });
        }

        $(document).on('click', '.delete_category', function (e) {
            e.preventDefault();
            //click this button(delete_category) to get the value(category_id)
            var cat_id = $(this).val(); 
            // alert(cat_id);
            $('#delete_cat_id').val(cat_id);
            $('#deleteCategoryModal').modal('show');
        });
        $(document).on('click', '.delete_category_btn', function (e) {
            e.preventDefault();
            var cat_id = $('#delete_cat_id').val();
            alert('Category Deleted!');
            $('#deleteCategoryModal').modal('hide'); 

            fetchcategory();

            //token taken from laravel documentation
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });
            $.ajax({
                type: "DELETE",
                url: "/clinical/bbr-category-configuration-delete/" cat_id,
                dataType: "dataType",
            });
        });

        $(document).on('click','.edit_category',function (e) {
            e.preventDefault();
            var cat_id = $(this).val();
            console.log(cat_id);
            $('#editCategoryModal').modal('show');
            $.ajax({
                type: "GET",
                url: "/clinical/bbr-category-configuration-edit/" cat_id,
                success: function (response) {
                     console.log(response);
                    if(response.status == 404) {
                        $('#success_message').html("");
                        $('#success_message').addClass('alert alert-danger');
                        $('#success_message').text(response.message);
                    } else {
                        $('#edit_category_name').val(response.category_edit.category_name);
                        $('#edit_category_description').val(response.category_edit.category_description);
                        $('#edit_cat_id').val(response.category_edit.category_id);
                    }
                }
            });
        });

        $(document).on('click', '.update_category', function (e){
            e.preventDefault();
            var cat_id = $('#edit_cat_id').val();
            var update_data = {
                'category_name' : $('#edit_category_name').val(),
                'category_description' : $('#edit_category_description').val(),
            }

            //token taken from laravel documentation
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });

            $.ajax({
                type: "POST",
                url: "/clinical/bbr-category-configuration-update/" cat_id,
                data: update_data,
                dataType: "json",
                success: function (response){
                    // console.log(response);
                    if(response.status == 400) {
                        $('#category_formCheckUpdate').html("");
                        $('#category_formCheckUpdate').addClass('alert alert-danger');
                        $.each(response.errors, function (key, err_values) {
                            $('#category_formCheckUpdate').append('<li>' err_values '</li>');
                        });
                    } else if(response.status == 404) {
                        $('#category_formCheckUpdate').html("");
                        $('#category_notif').addClass('alert alert-success');
                        $('#category_notif').text(response.message);
                    } else {
                        $('#category_formCheckUpdate').html("");
                        $('#category_notif').html("");
                        $('#category_notif').addClass('alert alert-success');
                        $('#category_notif').text(response.message);
                        $('#editCategoryModal').modal('hide');
                        fetchcategory();
                    }
                }
            });
        });

        $(document).on('click', '.add_category', function(e){
            e.preventDefault();
            var category_data = {
                'category_name': $('.category_name').val(),
                'category_description': $('.category_description').val(),
                'category_description': $('.category_description').val(),
                'config_view_type': $('.config_view_type').val(),
                'config_edit_type': $('.config_edit_type').val(),
                'bbrmode_view_type': $('.bbrmode_view_type').val(),
            }
            
            //token taken from laravel documentation
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });
            $.ajax({
                type: "POST",
                url: "/clinical/bbr-category-configuration",
                data: category_data,
                dataType: "json",
                success: function (response){
                    console.log(response);
                if(response.status == 400) {
                    $('#category_formCheck').html("");
                    $('#category_formCheck').addClass('alert alert-danger');
                    $.each(response.errors, function (key, err_values) {
                        $('#category_formCheck').append('<li>' err_values '</li>');
                    });
                    }
                else  
                  {
                    $('#category_notif').html("");
                    $('#category_notif').addClass('alert alert-success');
                    $('#category_notif').text(response.message);
                    $('#createCategory').modal('hide');
                    fetchcategory();
                    }
                }
            });
        });
    });
 

Комментарии:

1. можете ли вы использовать код fetchcategory()

2. @JohnLobo добавил

3. Привет, просто опустоши свое тело . Просто добавляйте $('tbody').empty() перед каждым циклом .

Ответ №1:

Вы можете избежать добавления внизу, используя $('tbody').html() вместо $('tbody').append( этого

 function fetchcategory() {
        $.ajax({
            type: "GET",
            url: "/clinical/bbr-category-configuration-data",
            dataType: "json",
            success: function (response){
                var tbody="";
                $.each(response.all_categories, function (key, cat) {
                   tbody =`
                            <tr>
                                <td><p class="font-weight-bold mb-0">${cat.category_name}</p>${cat.category_description}</td>
                                <td>View:
                                    <mark class="mark-orange">${gettype(cat.config_view_type)}</mark>
                                    <br>Edit:
                                    <mark class="mark-orange">${gettype(cat.config_edit_type)}</mark>
                                </td>
                                <td>View:
                                    <mark class="mark-orange">${gettype(cat.bbrmode_view_type)}</mark>
                                </td>
                                <td>
                                    <button type="button" value="${cat.category_id}" class="edit_category btn btn-outline-secondary"><i class="fas fa-edit"></i> Edit</button>
                                    <button type="button" value="${cat.category_id}" class="delete_category btn btn-outline-secondary"><i class="fas fa-trash"></i> Delete</button>
                                </td>
                            </tr>`;
                });

                $('tbody').html(tbody)
                    function gettype(type) {
                    var c_type = '';
                    if (type == 'P') {
                        c_type = 'Public'
                    } else if (type == 'R') {
                        c_type = 'Restricted'
                    } else if (type == undefined){
                        c_type = 'N/A'
                    }
                    return c_type;
                }

            }
        });
    }
 

Комментарии:

1. ах, я вижу, похоже, это только из-за добавления. спасибо за предоставление еще одной ценной информации/обучения!

2. @STGSH. даже предложение swati с $(‘tbody’).empty() перед каждым также хорошо работает