Подтвердить что ты не робот

Jquery datatables: добавление дополнительной колонки

Сценарий

Я использую (@версия 1.9.4) в первый раз для отображения данных пользователю. Мне удается получить данные через ajax и привязать их к данным.

Теперь я хочу добавить дополнительные столбцы, чтобы пользователь мог обработать записи. Для удобства использования цель состоит в том, чтобы добавить кнопку с обработчиком onclick, который извлекает данные записи "щелкнули".

В моем плане я бы привязал элемент json, соответствующий записи "clicked", к обработчику onclick.

До сих пор, если я добавлю дополнительный TH для столбца действия в DOM, из кода datatables возникает ошибка:

Requested unknown parameter '5' from data source for row 0

Вопрос

Как настроить пользовательские столбцы? Как заполнить их содержимое HTML?


Вот моя фактическая конфигурация.

HTML

<table id="tableCities">
    <thead>
        <tr>
            <th>country</th>
            <th>zip</th>
            <th>city</th>
            <th>district code</th>
            <th>district description</th>
            <th>actions</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>

Javascript

$('#tableCities').dataTable({
    "bPaginate": true,
    "bLengthChange": false,
    "bFilter": true,
    "bSort": true,
    "bInfo": false,
    "bAutoWidth": true
    , "bJQueryUI": true
    , "bProcessing": true
    , "bServerSide": true
    , "sAjaxSource": "../biz/GetCitiesByZip.asp?t=" + t
});

Пример результата Json

{
    "aaData":
    [
        [
            "IT",
            "10030",
            "VILLAREGGIA",
            "TO",
            "Torino"
        ],
        [
            "IT",
            "10030",
            "VISCHE",
            "TO",
            "Torino"
        ]
    ],
    "iTotalRecords": 2,
    "iTotalDisplayRecords": 2,
    "iDisplayStart": 0,
    "iDisplayLength": 2
}

Edit

Daniel является правильным. Решение состоит в том, чтобы настроить пользовательский столбец в aoColumnDefs, указав свойства mData и mRender. В частности, mRender позволяет определять пользовательские html и javascript.

/* inside datatable initialization */
, "aoColumnDefs": [
   {
        "aTargets": [5],
        "mData": null,
        "mRender": function (data, type, full) {
            return '<a href="#" onclick="alert(\''+ full[0] +'\');">Process</a>';
        }
    }
 ]
4b9b3361

Ответ 1

Вы можете определить свои столбцы по-другому как это

"aoColumns": [
        null,
        null,
        null,
        null,
        null,
        { "mData": null }
    ]

или

"aoColumnDefs":[
    {
        "aTargets":[5],
        "mData": null
    }
]

Здесь некоторые документы Columns

Взгляните на этот исходный пример DataTables AJAX - нулевой источник данных для столбца

Обратите внимание, что до DataTables 1.9.2 mData называлась mDataProp. Изменение имени отражает гибкость этого свойства и соответствует названию mRender. Если "mDataProp" задан, он все равно будет использоваться DataTables, так как он автоматически сопоставляет старое имя с новым, если требуется.

Другим решением/обходным решением может быть добавление параметра "5"...

Например, добавление дополнительных "" в каждую строку

вот так:

    [
        "IT",
        "10030",
        "VILLAREGGIA",
        "TO",
        "Torino",
        ""
    ],
    [
        "IT",
        "10030",
        "VISCHE",
        "TO",
        "Torino",
        ""
    ]

Ответ 2

На всякий случай, если кто-либо, использующий новую версию DataTables (1.10+), ищет ответ на этот вопрос, я следил за указаниями на этой странице:

https://datatables.net/examples/ajax/null_data_source.html

Ответ 3

Проводя этот ответ здесь, просто чтобы показать, где должно быть определено aoColumnDefs. Я сам получил помощь от этого вопроса, но некоторое время боролся за то, куда положить aoColumnDefs. Кроме того, добавлена ​​функциональность для события onclick.

$(document).ready(function() {
  var table = $('#userTable').DataTable( {
        "sAjaxSource": "/MyApp/proctoring/user/getAll",
        "sAjaxDataProp": "users",
        "columns": [
                    { "data": "username" },
                    { "data": "name" },
                    { "data": "surname" },
                    { "data": "status" },
                    { "data": "emailAddress" },
                    { "data" : "userId" }
                  ],
        "aoColumnDefs": [
           {
                "aTargets": [5],
                "mData": "userId",
                "mRender": function (data, type, full) {
                    return '<button href="#"' + 'id="'+ data + '">Edit</button>';
                }
            }
         ]
    } );

    $('#userTable tbody').on( 'click', 'button', function () {
        var data = table.row( $(this).parents('tr') ).data();
        console.log(data);
        $('#userEditModal').modal('show');
    });

} );