Datatables JQuery Добавление новой строки - не работает - PullRequest
0 голосов
/ 15 апреля 2020

HTML:

        <div class="datatable-header">
             <button type="button" name="add" id="add" class="float-right btn btn-info">Add</button>
         </div>

        <div class="table-responsive">
            <table class="table datatable-basic table-striped table-hover table-bordered"
                   data-data-url="<?= $this->url('bla/blabla/ajax', ['action' => 'list']) ?>
                   id="text-dataTable"
            >
                <thead>
                <tr>
                    <th>Text</th>
                    <th>Actions</th>
                 </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>

JQuery:

 const textTable = $('#text-dataTable');
        const textDataTable = textTable.DataTable({
            "lengthMenu": [[10, 25, 50, 75, -1], [10, 25, 50, 75, "All"]],
            "dom": '<"top"fBr><"datatable-scroll-wrap"t><"bottom mt-2"ilp>',
            "lengthChange": true,
            "pageLength": 25,
            "autoWidth": false,
            "searching": false,
            "order": [[0, 'asc']],
            "ajax": {
                "url": textTable.data('data-url'),
                "type": "POST"
            },
            "columnDefs": [
                { targets: [1], className: "text-center"},
            ],
            "columns": [
                { data: "text", "render": function (data, type, full, meta) {
                        return '<textarea style="width: 100%"  contenteditable id="text" class="update" data-id="'+full.id+'" data-column="text">' + data + '</textarea>';
                    }
                },
                { data: "textId", "render": function (data, type, full, meta) {
                        let $html =  '<a class="btn bg-success m-1 update" data-id="'+data+'"><i class="icon-floppy-disk"></i> Update</a>';
                         $html +=  '<a class="btn bg-danger m-1 remove" data-id="'+data+'"><i class="icon-trash"></i> Delete</a>';
                         $html +=  '<a class="btn bg-grey m-1 reset" data-id="'+data+'"><i class="icon-reset"></i> Reset</a>';
                         return $html;
                    }
                },
            ],
            "rowCallback": function (row, data, index) {
                if (data.hasOwnProperty('rowClass')) {
                    $(row).attr('class', data.rowClass);
                }

                $('td:last', row).attr('class', 'text-center');
                }
        });

        $('#add').click(function(){
            const addedRow = textDataTable.row.add(
                {
                    "text": "aa",
                    "textId": "bb",
                }
           );
            textDataTable.draw( false );
            const addedRowNode = addedRow.node();
            $(addedRowNode).addClass('highlight');
        });

Результат: обновляется текст для первого столбца и идентификатор данных второго столбца, мой Цель состоит в том, чтобы добавить новую пустую строку, что означает, что я хочу, чтобы в первом столбце было «aa», а во втором столбце - «bb» вместо кнопок. Я напрасно пробовал сотни вещей.

См. Снимок экрана:

enter image description here

Второе, что я попробовал: это проблема, потому что, если пользователь добавляет несколько строк одновременно и нажмите вставить один за другим, он всегда будет вставлять значение первой новой добавленной строки, так как он получает значение по идентификатору. И все новые строки имеют одинаковый идентификатор.


      $('#add').click(function(){

            let html = '<tr>';
            html += '<td><textarea contenteditable id="new-row-text">aa</textarea></td>';
            html += '<td><a class="btn bg-grey m-1 insert"><i class="icon-plus22"></i> Insert</a></td>';
            html += '</tr>';
            $('#text-dataTable tbody').prepend(html);
        });

        textDataTable.on('click', 'a.insert', function(){

            swal.fire({
                title: 'Are You Sure?',
                showCancelButton: true,
                confirmButtonClass: "btn-success",
                reverseButtons: true,
                showLoaderOnConfirm: true,
                preConfirm: function (data) {
                    return new Promise(function (resolve, reject) {
                        $.post(
                            textDataTable.data('insert-url'),
                            {
                                text: $('#new-row-text').val()
                            },
                            (function data($data) {
                                resolve()
                            }),
                            'json'

                        ).fail((function(xhr, status, error) {
                            swal.fire('Error', xhr.responseJSON.error, 'error');

                        }));
                    })
                }

            }).then(result => {
                if (result.value) {
                    textDataTable.ajax.reload();
                } else {
                }
            }, (function () {

            }));

        });

1 Ответ

0 голосов
/ 15 апреля 2020

Решение:

const addedRow = textDataTable.row.add(
 {
     "text": "aa",
     "textId": "bb",
     "newRow": true
 }

);

Затем в функции визуализации проверьте, существует ли флаг newRow:

{ data: "textId", "render": function (data, type, full, meta) {
        // Return data if new row
        if (full.hasOwnProperty('newRow') {
          return data;
        }
.
.
},

Кредитный пользователь 2Fkthorngren: https://datatables.net/forums/discussion/61522/problem-with-adding-new-empty-row/p1?new=1

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