JQuery Datatables: ไม่สามารถอ่านคุณสมบัติ 'aDataSort' ของ undefined


99

ฉันสร้างซอนี้ขึ้นมาและใช้งานได้ดีตามความต้องการของฉัน: ซอ

อย่างไรก็ตามเมื่อฉันใช้สิ่งเดียวกันในแอปพลิเคชันของฉันฉันได้รับข้อผิดพลาดในคอนโซลของเบราว์เซอร์ว่าไม่สามารถอ่านคุณสมบัติ 'aDataSort' ของไม่ได้กำหนด

ในแอปพลิเคชันของฉันจาวาสคริปต์อ่านบางสิ่งดังต่อไปนี้: ฉันได้ตรวจสอบเอาต์พุตคอนโทรลเลอร์แล้ว ... ทำงานได้ดีและพิมพ์บนคอนโซลด้วย

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

    }       

})

โปรดตรวจสอบให้แน่ใจว่ารหัสที่คุณใส่นั้นเหมือนกับซอ (ไม่ใช่) และรหัสที่คุณกำลังเรียกใช้ นอกจากนี้ในซอคุณมีสอง aTargets [0] ให้ตรวจสอบ: jsfiddle.net/gL0p0t42
Leandro Carracedo

คุณไม่ได้ให้แหล่งที่มาที่เรียกว่า "aDataSort" จริงๆ
Daniel

คุณหมายถึง id ของตาราง html หรือเปล่า? ฉันได้ดูแลสิ่งนั้นแล้ว ให้ฉันลองมีเป้าหมายเดียว
swateek


1
ฉันมีปัญหาเดียวกันและฉันพบว่าฉันสั่งตามหมายเลขคอลัมน์ซึ่งไม่มีอยู่ .. ฉันมีเพียง 3 cols แต่ฉันเรียงลำดับตามลำดับที่ห้า
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
จะเกิดอะไรขึ้นถ้าฉันมีข้อกำหนดที่เกี่ยวข้องกับการกำหนดค่าคอลัมน์และจำนวนคอลัมน์ดังกล่าวใน Runtime? ฉันจะติดตั้งโค้ดสำหรับข้อกำหนดข้างต้นได้อย่างไร?
CS Lewis

สิ่งนี้ช่วยฉันแก้ปัญหาข้อมูลไม่ได้พิมพ์ออกมา ดีมันยังช่วยให้ฉันเพื่อแก้ปัญหาที่มากขึ้นของเหมือง DataTable ที่ผมเขียนแล้วมันก็สามารถที่จะดูรายการในลำดับถัดลงที่มาจากตัวควบคุมเป็น"Sort":false Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action)
Sorangwala Abbasali

2
<thead>ต้องมี<tr>แล้ว<th>s
brahimm

นี่เป็นเรื่องจริงสำหรับ DataTable มาตรฐาน (และแก้ปัญหาของฉัน) RE: @CSLewis: ฉันไม่แน่ใจกับตารางแบบคงที่ แต่ถ้าคุณกำลังกำหนดค่าคอลัมน์ที่รันไทม์ควบคู่ไปกับคำขอ ajax ไม่จำเป็นต้องมีอะไรเลย<thead>แต่คุณต้องกำหนดคอลัมน์ในการเริ่มต้น DataTable () ของคุณดังนี้: datatables .net / reference / option / column.data
Harvey Dobson

64

ยังมีปัญหานี้อาร์เรย์นี้อยู่นอกช่วง:

order: [1, 'asc'],

1
คนนี้มักจะได้รับฉัน มีวิธีเริ่มต้นอาร์เรย์เป็น 0 หรือไม่หากอาร์เรย์อยู่นอกช่วง
JGreasley

6
@JGreasley คุณสามารถตั้งค่าเป็นอาร์เรย์ว่างได้: order: []
hogarth45

2
คอลัมน์เหมืองที่ 5 และฉันระบุ 7 ที่นี่! ขอบคุณ
aiffin

1
หนึ่ง! สัปดาห์! หนึ่งสัปดาห์เต็ม! และนั่นคือสัปดาห์ 7 วัน! และฉันค่อนข้างมั่นใจว่าฉันไม่ได้ทำงาน 9 ต่อ 5 เหมือน 9 ถึงเที่ยงคืน ... ทั้งหมดนั้นหายไปเพราะฉันไม่รู้เกี่ยวกับบั๊กนี้ !! อร๊ายยยยยย !! ... เสียเวลาไปมากแล้วฉันรู้สึกละอายใจอย่างมากฉันค้นหาอินเทอร์เน็ตซ้ำแล้วซ้ำเล่าและทดลองวิธีแก้ปัญหาที่เป็นไปได้ทั้งหมด - ไม่มีใครจะมา 'แก้ไข' สิ่งนี้ได้ แล้ว ... ด้วยความบังเอิญและสิ้นหวังแล้ว ... ฉันเจอคำตอบของคุณและตาดา! ในห้านาทีทุกอย่างได้รับการแก้ไข ถ้าฉันรวยฉันจะส่งเช็คให้คุณ€ 10,000 - lol
Gwyneth Llewelyn

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 ด้านบนระบุปัญหา / ข้อบกพร่องอย่างถูกต้อง แต่ยังไม่ชัดเจนว่าเหตุใดจึงเป็นปัญหาในความเป็นจริง ฉันตอบคุณในอีกสองปีต่อมา ... และเห็นได้ชัดว่าสิ่งนี้ยังไม่ได้รับการแก้ไขไม่ได้ระบุไว้ในเอกสารอย่างเป็นทางการอย่างน้อยที่สุดเท่าที่ฉันรู้
Gwyneth Llewelyn

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 attribute บนตารางให้ใช้แบบนี้data-order='[[1, "asc"]]'


ไม่เกี่ยวข้องกับคำถามของ OP แต่ใช้ได้กับกรณีของฉัน (ใช้แอตทริบิวต์ข้อมูล html 5)
blackbiron

0

ในกรณีของฉันฉันแก้ไขปัญหาโดยการสร้างหมายเลขคอลัมน์ที่ถูกต้องเมื่อใช้orderคุณสมบัติภายในสคริปต์ที่คุณกำหนดค่าตารางข้อมูล

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

มีคำตอบอื่นอยู่แล้วที่บอกว่าโดยพื้นฐานแล้วเป็นสิ่งเดียวกัน โปรดพยายามหลีกเลี่ยงคำตอบซ้ำซ้อนสำหรับคำถามที่มีอายุหลายปี
thelr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.