dataTable 删除数据后重绘;数据依然存在;如何破?

1.两个datatable; 第一个是点击添加的时候,出现在模态框中,异步请求数据;正常
2.添加选择的数据到另一个datatable2的时候,也是正常的,
3.datatable2列表中,删除(删除dom节点)数据A行后,表格重绘显示正常,但是从datatable1中再次添加A到datatable时,添加虽然成功, 原来删除消失的A行又出现了,出现了两行A数据;
4.第二次删除,我把表格数据中的需要删除的数据分离,重新组装后,表格重绘正常,但是再次添加删除的数据,依然出现在原来的位置;造成数据重复.

是这样的: tab1 是在一个模态框中显示的商品列表;数据源是ajax请求; tab2 是一个单纯的商品列表; 需求就是:点击添加商品;从tab1商品列表中,选择商品;添加到 tab2 中; 客户添加后,会在tab2中有删除商品的操作; 但是现在: 我测试时发现:tab2列表中删除后,再次从tab1中添加刚刚删除的商品, tab2 会同时显示刚删除的和刚添加的商品;也就是两个;如图示

请教一下,如何破?
ps:(如何修改源数据;之前用layui的数据表格也是这个问题;)
**datatable1是ajax请求数据源;
datatable2 是数据列表;不分页; 数据源是从datatable1中传过来的数组对象 ,显示从datatable1中添加的商品列表;**

     var item = []

        // 模态框中显示商品列表[json]
        $(document).ready(function () {
            $('#add-goods').click(function () {
                var table = $('#myTable').DataTable({
                    // 开启服务器
                    serverSide: true,
                    'language': language,
                    'renderer': 'bootstrap',
                    'pagingType': 'simple_numbers',
                    // 数据源
                    "ajax": {
                        "url": document.URL,
                        "type": "POST",
                        data: function (param) {
                            // ajax 验证参数
                            param.action = "getAllGoods";
                            param.category = $('#goods-category').val() ? $('#goods-category').val() : 0;
                            // console.log("请求的参数:", param);
                            return param;
                        },
                    },
                    // 设置每列显示的字段
                    "columns": [
                        {data: 'id'},
                        {
                            data: 'thumb_url', render: function (data, type, row, meta) {
                                // url图片路径显示为图片
                                return "<img class='admin-list-img-size' src='" + data + "' />";
                            }
                        },
                        {data: 'name'},
                        {data: 'bar_code'},
                        {data: 'unit'},
                        {data: 'category_name'},
                        {data: 'direct'},
                        {data: 'num'},
                        {data: 'price'},
                    ],
                    // 初始化回调函数
                    "initComplete": function (settings, json) {
                        // 监听分类的值 [动态数据需要用事件委托]
                        $(document).on('change', '#goods-category', function () {
                            // console.log(12)
                            table.ajax.reload();
                        })

                        // 点击选中行,标记 class
                        $('#myTable tbody').on('click', 'tr', function () {
                            $(this).toggleClass('selected');
                        })
                    },
                })


                // 保存选中的数据
                $('#button-save').click(function () {
                    // 获取选中行的长度
                    var length = table.rows('.selected').data().length;
                    // console.log(length );
                    // 获取选中的所有数据
                    let data = table.rows('.selected').data();

                    let ids = getGoodsIds();  // 获取所有 id合集
                    // console.log(ids)
                    // 循环每一行
                    for (let i = 0; i < length; i++) {
                        // console.log(data[i])
                        // 1.获取当前数据的id, 表格中所有ids
                        let id = data[i].id;
                        // 2.存在跳出当前循环,继续执行后续代码
                        if ($.inArray(id, ids) >= 0) {
                            continue;
                        }
                        // 添加商品
                        item.push(data[i])
                    }
                    addRows(item)
                    // 隐藏modal
                    $('#myModal').modal('hide');
                });

                // 请求服务器失败打印错误信息
                $.fn.dataTable.ext.errMode = function (settings, tn, msg) {
                    console.log(msg);
                }
                // 去除之前选中的标记
                $('#myTable tbody').find('.selected').toggleClass('selected');
                // 判断是否已经存在
                if (!($('#goods-category').val() >= 0)) {
                    // 增加商品分类下拉框
                    $('#myTable_length').after(
                        "<div class=" + '"' + "dataTables_length" + '"' + "id=" + '"' + "goods-category2" + '"' + "style='margin-left: 200px;'>" +
                        "<select id='goods-category' name=" + '"' + "category" + '"' + "aria-controls=" + '"' + "myTable" + '"' + 'style="width: 200px;">' +
                        "<option value=" + '"' + "0" + '"' + ">请选择分类</option>" +
                        "{volist name='category_list' id='vo'}" +
                        "<option value=" + '"' + "{$vo['id']}" + '"' + ">{$vo['name']}</option>" +
                        "{/volist}" +
                        "</select></div>"
                    );
                }
            })

            var goodsList = $('#goodsList').DataTable({
                "paging": false,
                "ordering": false,
                'renderer': 'bootstrap',
                'data': null,
                "language": {
                    "sSearch": "搜索",
                    "sLengthMenu": "每页显示 _MENU_ 条记录",
                    "sZeroRecords": "抱歉, 没有找到",
                    "sInfo": "从 _START_ 到 _END_ /共 _TOTAL_ 件商品",
                    "sInfoEmpty": "没有数据",
                    "sInfoFiltered": "(从 _MAX_ 条数据中检索)",
                    "sProcessing": "<img src='./loading.gif' width='35px' height='35px' />",
                    "sZeroRecords": "没有检索到数据",
                    "emptyTable": "未选择促销的商品!"
                },
                // 设置复选框
                select: {
                    style: 'os',
                    selector: 'td:first-child'
                },
                // 设置每列显示的字段
                "columns": [{
                    "data": null,
                    "defaultContent": '',
                    "className": 'select-checkbox',
                    "orderable": false,
                }, {
                    "data": null,
                    "title": '序号',
                    "className": "text-center",
                    "width": "30px",
                    render: function (data, type, row, meta) { /*显示行号*/
                        return 1 + meta.row;
                    }
                }, {
                    "data": "id",
                    "title": 'ID'
                }, {
                    "data": "name",
                    "title": '名称'
                }, {
                    "data": "bar_code",
                    "title": '编号'
                }, {
                    "data": "unit",
                    "title": '单位'
                }, {
                    "data": "unit_group",
                    "title": '规格'
                }, {
                    "data": "goods_code",
                    "title": '编号'
                }, {
                    "data": "price",
                    "title": '入库价'
                }, {
                    "data": "price",
                    "title": '单价'
                }, {
                    "data": "price",
                    "title": '特价'
                }, {
                    "data": "num",
                    "title": '每单限量'
                }, {
                    "data": "num",
                    "title": '会员限量'
                }],
                // 初始化回调函数
                "initComplete": function (settings, json) {
                    // 监听分类的值 [动态数据需要用事件委托]
                    // $(document).on('change', '#goods-category', function () {
                    //     // console.log(12)
                    //     table.ajax.reload();
                    // })

                    // 点击选中行,标记 class
                    // $('#myTable tbody').on('click', 'tr', function () {
                    //     $(this).toggleClass('selected');
                    // })
                },
            })
            // 重绘表格
            function addRows(data) {
                goodsList.clear();
                goodsList.rows.add(data).draw();
            }
            // 获取所有 id合集
            function getGoodsIds(){
                let arr = []
                goodsList.column(2).data().each(function (item) {
                    arr.push(item)
                });
                return arr
            }
            //删除点击行
            $('#goodsList tbody').on('click', 'tr', function () {
                let id = $(this).find('td:eq(2)').text()   // 当前id
                let res = []
                goodsList.data().each(function (item) {   // 去除需要删除的数据
                    if (id != item.id) {
                        res.push(item)
                    }
                });
                // 组装好;重绘
                addRows(res)

图片描述

图片描述

图片描述

阅读 4.7k
1 个回答
删除你需要发送请求把数据库的值也清除啊!!!
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进