วิธีอัปเดตตารางข้อมูลด้วยตนเองด้วยข้อมูล JSON ใหม่


102

ฉันใช้ปลั๊กอินjQuery datatablesและโหลดข้อมูลของฉันซึ่งฉันได้โหลดใน DOM ที่ด้านล่างของหน้าและเริ่มต้นปลั๊กอินด้วยวิธีนี้:

var myData = [
    {
        "id": 1,
        "first_name": "John",
        "last_name": "Doe"
    }
];

$('#table').dataTable({
    data: myData
        columns: [
        { data: 'id' },
        { data: 'first_name' },
        { data: 'last_name' }
    ]
});

ตอนนี้. หลังจากดำเนินการบางอย่างแล้วฉันต้องการรับข้อมูลใหม่โดยใช้ ajax (แต่ไม่ใช่ตัวเลือก ajax ที่สร้างในดาต้า - อย่าเข้าใจฉันผิด!) และอัปเดตตารางด้วยข้อมูลเหล่านี้ ฉันจะทำได้อย่างไรโดยใช้ Datatables API เอกสารมีความสับสนมากและฉันไม่สามารถหาวิธีแก้ไขได้ ความช่วยเหลือใด ๆ จะได้รับการชื่นชมเป็นอย่างมาก ขอบคุณ.


จะลบ tablebody ที่มีอยู่แล้วสร้างใหม่ได้อย่างไร
ผู้สื่อข่าว

คำตอบ:


179

วิธีแก้ปัญหา: (หมายเหตุ: โซลูชันนี้มีไว้สำหรับรุ่นข้อมูล 1.10.4 (ในขณะนี้) ไม่ใช่เวอร์ชันดั้งเดิม)

ชี้แจงตามที่ระบุเอกสาร API (1.10.15) API ที่สามารถเข้าถึงได้สามวิธี:

  1. คำจำกัดความที่ทันสมัยของ DataTables (กรณีอูฐด้านบน):

    var datatable = $( selector ).DataTable();

  2. คำจำกัดความดั้งเดิมของ DataTables (ตัวพิมพ์เล็กอูฐ):

    var datatable = $( selector ).dataTable().api();

  3. การใช้newไวยากรณ์

    var datatable = new $.fn.dataTable.Api( selector );

จากนั้นโหลดข้อมูลดังนี้:

$.get('myUrl', function(newDataArray) {
    datatable.clear();
    datatable.rows.add(newDataArray);
    datatable.draw();
});

ใช้draw(false)เพื่ออยู่ในหน้าเดียวกันหลังจากการอัปเดตข้อมูล

การอ้างอิง API:

https://datatables.net/reference/api/clear ()

https://datatables.net/reference/api/rows.add ()

https://datatables.net/reference/api/draw ()


4
มันหายากเกินไปขอบคุณมาก! การใช้สิ่งนี้เพื่อคงข้อมูลระหว่างเซิร์ฟเวอร์ Roundtrips
Doug

สิ่งที่เกี่ยวกับ datatables เวอร์ชัน 1.9.4 ฉันประสบปัญหาเดียวกันในนั้น
Hardik Masalawala

5
ฉันแค่อยากจะเพิ่มว่าคุณสามารถเชื่อมโยงวิธีการ (เช่นdatatable.clear().rows.add(newDataArray).draw()) ได้ ตามความคิดเห็นนี้ฉันใช้เวอร์ชัน 1.10.18
Sal_Vader_808

ฉันจะเพิ่มคอลัมน์หนึ่งคอลัมน์ด้วยปุ่มควบคุมได้อย่างไร
ajinkya

31

คุณสามารถใช้ได้:

$('#table').dataTable().fnClearTable();
$('#table').dataTable().fnAddData(myData2);

Jsfiddle

อัปเดต. และใช่เอกสารปัจจุบันไม่ดีนัก แต่ถ้าคุณโอเคโดยใช้เวอร์ชันเก่าคุณสามารถอ้างอิงเอกสารดั้งเดิมได้


ใช่คุณพูดถูก แต่ฉันใช้ datatables เวอร์ชันล่าสุด อย่างไรก็ตามฉันพบวิธีแก้ไขและอัปเดตคำถามของฉัน ขอบคุณที่ให้ความสนใจ :)
อินดี้

1
@CookieMan โปรดลบการแก้ไขของคุณและโพสต์เป็นคำตอบ หลังจากนั้นให้ทำเครื่องหมายว่ายอมรับ
ผู้สื่อข่าว

โซลูชันนี้ไม่ได้อัปเดตส่วนการแบ่งหน้า
Alok Deshwal

นี่มันเยี่ยมมาก ขอบคุณ
Chris

9

คุณต้องทำลายอินสแตนซ์ตารางข้อมูลเก่าแล้วเริ่มต้นตารางข้อมูลใหม่

ขั้นแรกตรวจสอบว่ามีอินสแตนซ์ตารางข้อมูลหรือไม่โดยใช้$ .fn.dataTable.isDataTable

หากมีอยู่ให้ทำลายมันแล้วสร้างอินสแตนซ์ใหม่เช่นนี้

    if ($.fn.dataTable.isDataTable('#dataTableExample')) {
        $('#dataTableExample').DataTable().destroy();
    }

    $('#dataTableExample').DataTable({
        responsive: true,
        destroy: true
    });

5

นี่คือวิธีแก้ปัญหาสำหรับ 1.9.4 แบบเดิมที่ดาต้าเบส

    var myData = [
      {
        "id": 1,
        "first_name": "Andy",
        "last_name": "Anderson"
      }
   ];
    var myData2 = [
      {
        "id": 2,
        "first_name": "Bob",
        "last_name": "Benson"
      }
    ];

  $('#table').dataTable({
  //  data: myData,
       aoColumns: [
         { mData: 'id' },
         { mData: 'first_name' },
         { mData: 'last_name' }
      ]
  });

 $('#table').dataTable().fnClearTable();
 $('#table').dataTable().fnAddData(myData2);

ใช้งานได้กับเวอร์ชันล่าสุด (โปรดพิจารณาวันที่ของความคิดเห็น) ขอบคุณ Vikas!
Telmo

สิ่งนี้ได้ผลสำหรับฉัน แต่ฉันไม่เข้าใจว่าทำไมฉันถึงใช้ตัวอย่างเหล่านี้ได้ var datatable = $ (selector) .DataTable (); var datatable = $ (ตัวเลือก) .dataTable (). api (); var datatable = ใหม่ $ .fn.dataTable.Api (ตัวเลือก); แต่เมื่อเพิ่ม. row (). add () ไม่ทำงาน
Fernando Palma

4

ในกรณีของฉันฉันไม่ได้ใช้ ajax api ในตัวเพื่อป้อน Json ไปยังตาราง (นี่เป็นเพราะการจัดรูปแบบบางอย่างที่ค่อนข้างยากที่จะนำไปใช้ภายในการเรียกกลับการแสดงผลของข้อมูลที่สามารถใช้งานได้)

วิธีแก้ปัญหาของฉันคือการสร้างตัวแปรในขอบเขตภายนอกของฟังก์ชัน onload และฟังก์ชันที่จัดการการรีเฟรชข้อมูล ( var table = nullตัวอย่างเช่น)

จากนั้นฉันสร้างอินสแตนซ์ตารางของฉันด้วยวิธีการโหลด

$(function () {
            //.... some code here
            table = $("#detailReportTable").DataTable();
            .... more code here
        });

และสุดท้ายในฟังก์ชั่นที่จัดการการรีเฟรชฉันเรียกใช้เมธอด clear () และ destroy () ดึงข้อมูลลงในตาราง html และสร้างอินสแตนซ์ข้อมูลใหม่อีกครั้งเช่น:

function getOrderDetail() {
            table.clear();
            table.destroy();
            ...
            $.ajax({
             //.....api call here
            });
            ....
            table = $("#detailReportTable").DataTable();
   }

ฉันหวังว่าใครบางคนจะพบว่าสิ่งนี้มีประโยชน์!


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