JQuery Datatables: Không thể đọc thuộc tính 'aDataSort' của undefined


96

Tôi tạo ra fiddle này để và nó hoạt động tốt theo yêu cầu của tôi: Fiddle

Tuy nhiên, khi tôi sử dụng cùng một trong ứng dụng của mình, tôi gặp lỗi trong bảng điều khiển trình duyệt nói Không thể đọc thuộc tính 'aDataSort' của không xác định

Trong ứng dụng của tôi, javascript đọc một thứ như dưới đây: Tôi đã kiểm tra đầu ra của bộ điều khiển ... nó hoạt động tốt và cũng được in trên bảng điều khiển.

$(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"
        }]
            });

    }       

})

Hãy chắc chắn rằng mã bạn đưa vào nó giống với mã fiddle (nó không phải) và mã bạn đang chạy. Ngoài ra trong trò chơi, bạn có hai aTargets [0], hãy kiểm tra: jsfiddle.net/gL0p0t42
Leandro Carracedo

Bạn không cung cấp nguồn thực sự gọi "aDataSort".
Daniel

Ý của bạn là id của bảng html? Tôi đã quan tâm đến điều đó. Hãy để tôi thử với một mục tiêu.
swateek

@Daniel nguồn là tham số của hàm loadDataTable ().
swateek

Câu trả lời:


131

Điều quan trọng là THEAD của bạn không được để trống trong bảng vì dataTable yêu cầu bạn chỉ định số cột của dữ liệu mong đợi. Theo dữ liệu của bạn, nó phải

<table id="datatable">
    <thead>
        <tr>
            <th>Subscriber ID</th>
            <th>Install Location</th>
            <th>Subscriber Name</th>
            <th>some data</th>
        </tr>
    </thead>
</table>

26
Điều gì sẽ xảy ra nếu tôi có yêu cầu liên quan đến việc định cấu hình các cột và số lượng các cột đã nói trong Thời gian chạy? Làm cách nào để triển khai mã cho yêu cầu nói trên?
CS Lewis

Điều này đã giúp tôi khắc phục sự cố dữ liệu không được in. Nó cũng giúp tôi khắc phục một vấn đề nữa của tôi đối với dữ liệu nơi tôi đã viết "Sort":false, sau đó nó có thể xem danh sách theo thứ tự giảm dần đến từ bộ điều khiển Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action).
Sorangwala Abbasali 14/12/16

2
các <thead>bạn cần phải chứa một <tr>, sau đó <th>
brahimm

Điều này đúng với một DataTable tiêu chuẩn (và giải quyết vấn đề của tôi). RE: @CSLewis: Tôi không chắc với các bảng tĩnh, nhưng nếu bạn đang định cấu hình các cột trong thời gian chạy cùng với một yêu cầu ajax thì không bắt buộc phải có bất kỳ thứ gì trong đó <thead>nhưng bạn phải xác định các cột trong phần khởi tạo DataTable () của mình như thế này: datatables .net / reference / option / column.data
Harvey Dobson

61

Cũng có vấn đề này, Mảng này nằm ngoài phạm vi:

order: [1, 'asc'],

1
Điều này luôn luôn được tôi. Có cách nào để mặc định mảng thành 0, nếu mảng nằm ngoài phạm vi?
JGreasley,

6
@JGreasley Bạn có thể thiết lập nó như là một mảng trống: thứ tự: []
hogarth45

2
Khai thác các cột trong đó 5 và tôi đã chỉ định 7 ở đây! Cảm ơn
aiffin 13/1217

1
Một! Tuần! Một tuần đầy đủ! Và đó là một tuần 7 ngày! Và tôi khá chắc chắn rằng tôi đã không làm việc từ 9 đến 5 giờ sáng, giống như 9 giờ đến nửa đêm ... tất cả những điều đó đã mất đi vì tôi không biết về lỗi này !! Arrrrrrrrrrrgh !! ... Quá nhiều thời gian bị lãng phí, tôi cảm thấy vô cùng xấu hổ, tôi đã tìm kiếm trên Internet nhiều lần và thử nghiệm với tất cả các giải pháp khả thi - thậm chí không có giải pháp nào gần như "sửa chữa" được điều này. Và sau đó ... tình cờ và đã tuyệt vọng ... Tôi đã xem được câu trả lời của bạn, và ta-da! Trong năm phút, mọi thứ đã được khắc phục . Nếu tôi giàu có, tôi sẽ gửi cho bạn một tấm séc trị giá 10 nghìn euro - lol
Gwyneth Llewelyn

9

Đối với tôi, lỗi nằm trong chính DataTables; Mã sắp xếp trong DataTables 1.10.9 sẽ không kiểm tra giới hạn; do đó nếu bạn sử dụng một cái gì đó như

order: [[1, 'asc']]

với một bảng trống, không có hàng idx 1 -> điều này đảm bảo ngoại lệ. Điều này đã xảy ra vì dữ liệu cho bảng đang được tìm nạp không đồng bộ. Ban đầu, khi tải trang, dataTable được khởi tạo mà không có dữ liệu. Nó sẽ được cập nhật sau đó ngay khi dữ liệu kết quả được tìm nạp.

Giải pháp của tôi:

// 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;

Cảm ơn bạn đã công phu về vấn đề này; @ hogarth45 ở trên đã xác định chính xác vấn đề / lỗi, nhưng không quá rõ ràng về lý do tại sao thực tế lại vấn đề. Tôi sẽ trả lời bạn hai năm sau ... và rõ ràng điều này đã không được sửa chữa, thậm chí không được đề cập trong tài liệu chính thức, ít nhất, theo như tôi biết.
Gwyneth Llewelyn

7

Tôi gặp phải vấn đề tương tự, những thay đổi sau đây đã giải quyết được vấn đề của tôi.

$(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
    } );
} );

các aoColumnsmảng mô tả chiều rộng của mỗi cột và nó sortablethuộc tính.

Một điều khác cần đề cập là lỗi này cũng sẽ xuất hiện khi bạn đặt hàng theo số cột không tồn tại.


4

Trong trường hợp của tôi, tôi đã có

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

Nơi đáng lẽ nó phải ở

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

Lưu ý: trong trường hợp của tôi, tôi phải làm trống bảng vì tôi có dữ liệu mà tôi muốn đã bị xóa trước khi chèn dữ liệu mới.

Chỉ nghĩ đến việc chia sẻ nơi nó "có thể" giúp đỡ ai đó trong tương lai!


1

Tôi gặp sự cố này là do một tập lệnh khác đang xóa tất cả các bảng và tạo lại chúng, nhưng bảng của tôi không được tạo lại. Tôi đã dành nhiều thời gian cho vấn đề này trước khi nhận thấy rằng bảng của tôi thậm chí không hiển thị trên trang. Bạn có thể xem bảng của mình trước khi khởi tạo DataTables không?

Về cơ bản, tập lệnh khác đã làm:

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();
  }
}

Và lẽ ra nó phải làm:

let tables = $("table.some-class-only");
... the rest ...

1

Bạn cần chuyển dấu ngoặc kép [']thành dấu ngoặc kép ["]do phân tích cú pháp

nếu bạn đang sử dụng thuộc tính thứ tự dữ liệu trên bảng thì hãy sử dụng nó như thế nàydata-order='[[1, "asc"]]'


nó không liên quan đến câu hỏi của OP nhưng nó hoạt động với trường hợp của tôi (sử dụng thuộc tính dữ liệu html 5)
blackbiron

-1

Trong trường hợp của tôi, tôi đã giải quyết vấn đề bằng cách thiết lập số cột hợp lệ khi áp dụng thuộc ordertính bên trong tập lệnh nơi bạn định cấu hình bảng dữ liệu.

var table = $('#mytable').DataTable({
     .
     .
     .
     order: [[ 1, "desc" ]],

Đã có những câu trả lời khác nói về cơ bản điều tương tự. Hãy cố gắng tránh những câu trả lời thừa cho những câu hỏi có tuổi đời.
thelr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.