Невозможно перечислить подробные данные в jQuery Datatable

#javascript #jquery #asp.net-mvc #datatable #datatables

#javascript #jquery #asp.net-mvc #datatable #таблицы данных

Вопрос:

Я следовал примеру jQuery Datatable — скользящие дочерние строки (просто посмотрите раздел «Полный код» на этой странице) в моем ASP.NET Проект MVC, и я мог бы правильно перечислить основные и статические данные. Однако, когда я хочу динамически извлекать подробные данные с помощью AJAX, я не могу правильно их перечислить из-за ошибки TypeError: table.fnOpen не является функцией. Существует решение, изменяющее D ataTable на d ataTable, но в этом случае я сталкиваюсь с другими ошибками. Проблема именно в методе click amp; format, и я думаю, что я допустил ошибку в каком-то определении. Не могли бы вы взглянуть и разъяснить мне, в чем ошибка? Заранее спасибо…

 function format(d) {
    return '<div class="slider">'  
    '<table style="width:100%">'  
      '<tr>'  
            '<th>Name</th>'  
            '<th>Surname</th> '  
            '<th>Number</th>'  
        '</tr>'  
        '<tr>'  
            '<td>'   d.StudentName   '</td>'  
            '<td>'   d.StudentSurname   '</td> '  
            '<td>'   d.StudentNumber   '</td>'  
        '</tr>'  
    '</table>'
    '</div>';
}


$(document).ready(function () {

    var table;
    table = $('#dtbLabGroup')
        .DataTable(

        //code omitted for brevity

        "columns": [
                    {
                        "class": 'details-control',
                        "orderable": false,
                        "data": null,
                        "defaultContent": ''
                    },
                    { "name": "Lab" },
                    { "name": "Schedule" },
                    { "name": "Term" },
                    { "name": "Status" }
        ],          
        "order": [[1, 'asc']],
    });


    // Add event listener for opening and closing details
    $('#dtbLabGroup tbody').on('click', 'td.details-control', function () {

        // !!! There might be a problem regarding to these 3 parameters
        var tr = $(this).closest('tr');
        var row = table.row(tr);            
        var nTr = $(this).parents('tr')[0];
        //

        if (row.child.isShown()) {
            // This row is already open - close it
            $('div.slider', row.child()).slideUp(function () {
                row.child.hide();
                tr.removeClass('shown');
            });
        }
        else {
            // Open this row
            row.child(format(row.data()), 'no-padding').show();
            tr.addClass('shown');

            $('div.slider', row.child()).slideDown();

            // !!! There is PROBABLY a problem
            // !!! I added the following code for retrieving data via AJAX call. 
            var id = 8; //used static id for testing
            $.get("GetStudents?id="   id, function (students) {
                table.fnOpen(nTr, students, 'details');
            });
        }
    }); 

}); 
  

Обновление I: ниже приведен модифицированный метод format():

 function format(d) {
    var htmlResult = '<div class="slider">'  
    '<table style="width:100%">'  
      '<tr>'  
            '<th>Name</th>'  
            '<th>Surname</th> '  
            '<th>Number</th>'  
        '</tr>';

       $.each(d, function (i, d) {
           htmlResult  = '<tr><td>'   d[i].StudentName   '</td><td>'   d[i].StudentSurname   '</td><td>'   d[i].StudentNumber   '</td></tr>';
       });

    htmlResult  = '</table>'  
    '</div>';
    return htmlResu<
}
  

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

1. fnOpen это синтаксис версии v1.9, поэтому изменение Datatables на datatables является решением. Пример, на который вы ссылались fnOpen , вообще не используется, поэтому мне интересно, почему вы его использовали? смотрите здесь

2. Потому что я должен использовать вызов AJAX для загрузки данных, и в примере, который я нашел, есть метод fnOpen. Есть ли лучший пример без fnOpen ? Спасибо…

3. Вы пытаетесь использовать fnOpen для добавления новой строки?

4. Нет, я использую версию v1.10, и я знаю, что мне не следует использовать fnOpen. Единственное, думаю, мне нужен format(row.child); метод (имеющий вызов AJAX), который вызывается из // Откройте раздел этой строки . Какой-нибудь пример его использования, пожалуйста? Большое спасибо…

5. Я все еще не понимаю, для чего вы пытаетесь использовать fnOpen

Ответ №1:

Вам нужно отобразить индикатор загрузки в дочерней строке, получить содержимое через Ajax и вставить его в дочернюю строку, заменив индикатор загрузки.

Например:

 // ... skipped ...

// Open this row
row.child('<p><center>Loading...</center></p>', 'no-padding' ).show();
tr.addClass('shown');
$('div.slider', row.child()).slideDown();

$.getJSON("GetStudents?id="   id, function(data){
   $('td', row.child()).html(format(data));
   $('div.slider', row.child()).show();
});

// ... skipped ...
  

Смотрите Этот пример для кода и демонстрации.

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

1. Спасибо за ответ. На самом деле я столкнулся с проблемой зависания при загрузке дочерних данных. Являются ли дочерние строки записи причиной этого зависания? Если да, должен ли я использовать «индикатор загрузки»? С другой стороны, лучше ли использовать асинхронный в вызове AJAX?

2. @ClintEastwood, Ajax-запрос по умолчанию асинхронный, поэтому необходим индикатор загрузки ( Loading... ). Синхронные запросы могут временно блокировать браузер, отключая любые действия, пока запрос активен.

3. Существует небольшая проблема, из-за которой индикатор загрузки зацикливается навсегда. Я добавил код формата в свой вопрос. Не могли бы вы взглянуть на это и разъяснить мне, как правильно создать цикл для нескольких дочерних записей?

4. @ClintEastwood, в вашем обновленном коде синтаксическая ошибка, а '</tr>' не должна быть '</tr>'; . Проверьте консоль на наличие ошибок.

5. Спасибо, но проблема связана с получением параметров данных в массиве, и никаких ошибок, кроме этого. Пожалуйста, недооценивайте ошибку tr и просто посмотрите, как получить значения записи в цикле?