JQuery Datatables: не удается прочитать свойство aDataSort из undefined

99

Я создал эту скрипку, и она хорошо работает в соответствии с моими требованиями: Fiddle

Однако, когда я использую то же самое в своем приложении, я получаю сообщение об ошибке в консоли браузера: Cannot read property 'aDataSort' of undefined

В моем приложении javascript читает что-то вроде следующего: Я проверил вывод контроллера ... он работает хорошо и также печатается на консоли.

$(document).ready(function() {

    $.getJSON("three.htm", function(data) {
             // console.log("loadDataTable >>  "+JSON.stringify(data));
             })
             .fail(function( jqxhr, textStatus, error ) {
             var err = textStatus + ', ' + error;
             alert(err);
             console.log( "Request Failed: " + err);
             })
             .success(function(data){
                 loadDataTable(data);
             });

    function loadDataTable(data){
         $("#recentSubscribers").dataTable().fnDestroy();    
         var oTable = $('#recentSubscribers').dataTable({
             "aaData" : JSON.parse(data.subscribers),
             "processing": true,
            "bPaginate": false,
            "bFilter": false,
            "bSort": false,
            "bInfo": false,
            "aoColumnDefs": [{
            "sTitle": "Subscriber ID",
            "aTargets": [0]
        }, {
            "sTitle": "Install Location",
            "aTargets": [1]
        }, {
            "sTitle": "Subscriber Name",
            "aTargets": [2]
        }, {
            "aTargets": [0], 
            "mRender": function (data, type, full) {
                return '<a style="text-decoration:none;" href="#" class="abc">' + data + '</a>';
            }
        }],
            "aoColumns": [{
            "mData": "code"
        }, {
            "mData": "acctNum"
        }, {
            "mData": "name"
        }]
            });

    }       

})
Swateek
источник
Пожалуйста, убедитесь, что код, который вы включили, совпадает со скрипкой (это не так) и той, которую вы используете. Также в скрипке у вас есть два aTargets [0], проверьте: jsfiddle.net/gL0p0t42
Леандро
Вы не предоставляете источник, который на самом деле вызывает «aDataSort».
Дэниел
Вы имеете в виду id таблицы html? Я позаботился об этом. Позвольте мне попробовать с одной целью.
swateek
2
связанный (более новый) вопрос с ответом
Никос М.
1
У меня была та же проблема, и я обнаружил, что заказываю по номеру столбца, которого не существует .. У меня было только 3 столбца, но я заказал пятый.
Hos Mercury

Ответы:

138

Важно, чтобы ваш THEAD не был пустым в таблице, поскольку dataTable требует, чтобы вы указывали количество столбцов ожидаемых данных. По вашим данным это должно быть

<table id="datatable">
    <thead>
        <tr>
            <th>Subscriber ID</th>
            <th>Install Location</th>
            <th>Subscriber Name</th>
            <th>some data</th>
        </tr>
    </thead>
</table>
Гкриш
источник
30
Что делать, если у меня есть требование, которое включает настройку столбцов и количество указанных столбцов во время выполнения? Как я могу реализовать код для вышеупомянутого требования?
CS Lewis
Это помогло мне решить мою проблему с непечатаемыми данными. Ну, это также помогло мне вылечить еще одну мою проблему для datatable, где я написал "Sort":false, затем он смог просмотреть список в порядке убывания, который поступил от контроллера как Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action).
Сорангвала Аббасали
2
в нем <thead>обязательно должно быть а <tr>, затем <th>с
брахимм 09
Это верно для стандартного DataTable (и решите мою проблему). RE: @CSLewis: я не уверен в статических таблицах, но если вы настраиваете столбцы во время выполнения вместе с запросом ajax, ничего не требуется, <thead>но вы должны определить столбцы в своем инициировании DataTable () следующим образом: datatables .net / reference / option / columns.data
Харви Добсон,
64

Также была эта проблема, этот массив был вне диапазона:

order: [1, 'asc'],
Хогарт45
источник
1
Этот всегда меня понимает. Есть ли способ установить для массива значение 0 по умолчанию, если массив выходит за пределы допустимого диапазона?
JGreasley
6
@JGreasley Вы можете установить его как пустой массив: order: []
hogarth45
2
Мои столбцы, где 5, и я указывал здесь 7! Спасибо
aiffin
1
Один! Неделя! Одна полная неделя! А это 7-дневная неделя! И я почти уверен, что я не работал с 9 до 5, скорее с 9 до полуночи ... все это потеряно, потому что я не знал об этой ошибке !! Arrrrrrrrrrrgh !! ... Столько времени потрачено впустую, мне очень стыдно, я снова и снова искал в Интернете и экспериментировал со всеми возможными решениями - ни одно из них даже близко не могло «исправить» это. А потом ... по чистой случайности и уже в отчаянии ... наткнулся на твой ответ, и тада! За пять минут все было исправлено . Если бы я был богат, я бы отправил вам чек на 10 тысяч евро - лол
Гвинет Ллевелин
9

Для меня ошибка была в самом DataTables; Код для сортировки в DataTables 1.10.9 не проверяет границы; таким образом, если вы используете что-то вроде

order: [[1, 'asc']]

с пустой таблицей нет строки idx 1 -> это исключение гарантирует. Это произошло, когда данные для таблицы были получены асинхронно. Первоначально при загрузке страницы dataTable инициализируется без данных. Его следует обновить позже, как только будут получены данные результата.

Мое решение:

// add within function _fnStringToCss( s ) in datatables.js
// directly after this line
// srcCol = nestedSort[i][0];

if(srcCol >= aoColumns.length) {
    continue;
}

// this line follows:
// aDataSort = aoColumns[ srcCol ].aDataSort;
Оливер Зендель
источник
Спасибо за ваше внимание к этому вопросу; @ hogarth45 выше определили проблему / ошибку , правильно, но не так ясно о том, почему это было, по сути, проблема. Я отвечаю вам через два года ... и, судя по всему, это не было исправлено, даже не упомянуто в официальной документации, по крайней мере, насколько мне известно.
Гвинет Ллевелин,
7

Я столкнулся с той же проблемой, следующие изменения решили мою проблему.

$(document).ready(function() {
     $('.datatable').dataTable( {
            bSort: false,
            aoColumns: [ { sWidth: "45%" }, { sWidth: "45%" }, { sWidth: "10%", bSearchable: false, bSortable: false } ],
        "scrollY":        "200px",
        "scrollCollapse": true,
        "info":           true,
        "paging":         true
    } );
} );

aoColumnsмассив описывает ширину каждого столбца и его sortableсвойства.

Еще одна вещь, о которой следует упомянуть, эта ошибка также появится при заказе по номеру столбца, которого не существует.

Абдул Манан
источник
4

В моем случае у меня было

$(`#my_table`).empty();

Где это должно было быть

$(`#my_table tbody`).empty();

Примечание: в моем случае мне пришлось очистить таблицу, так как у меня были данные, которые я хотел удалить, прежде чем вставлять новые данные.

Просто подумал о том, чтобы поделиться, где это «может» помочь кому-то в будущем!

ПрыжкиСлон
источник
1

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

По сути, другой скрипт делал:

let tables = $("table");
for (let i = 0; i < tables.length; i++) {
  const table = tables[i];
  if ($.fn.DataTable.isDataTable(table)) {
    $(table).DataTable().destroy(remove);
    $(table).empty();
  }
}

И это должно было быть:

let tables = $("table.some-class-only");
... the rest ...
Райан Шиллингтон
источник
1

Вам нужно переключить одинарные кавычки [']на двойные кавычки ["]из-за синтаксического анализа

если вы используете атрибут порядка данных в таблице, используйте его такdata-order='[[1, "asc"]]'

MohitGhodasara
источник
это не имеет отношения к вопросу OP, но он работает в моем случае (с использованием атрибутов данных html 5)
blackbiron
0

В моем случае я решил проблему, установив действительный номер столбца при применении orderсвойства внутри сценария, в котором вы настраиваете таблицу данных.

var table = $('#mytable').DataTable({
     .
     .
     .
     order: [[ 1, "desc" ]],
user13755332
источник
Уже есть другие ответы, в которых говорится в основном то же самое. Пожалуйста, постарайтесь избегать лишних ответов на вопросы, которым уже много лет.
thelr