สำหรับการใช้งานร่วมกับ jQuery นั้น จะมีความตรงไปตรงมาสูงมาก เพราะ Tabulator ถูกออกแบบมาให้ทำงานกับ DOM โดยตรงได้ดีอยู่แล้วครับ
ในโลกของ jQuery เราจะเก็บ Instance ไว้ในตัวแปรธรรมดา หรือจะใช้ .data() ของ jQuery เพื่อผูก Instance ไว้กับ Element นั้น ๆ ก็ได้ เพื่อให้เรียกใช้ซ้ำได้จากทุกที่ครับ
$(document).ready(function() {
// 1. กำหนดตัวแปรสำหรับเก็บ Instance (Reused Instance)
let tableInstance = null;
const $tableEl = $("#my-table");
// --- FUNCTION: INITIALIZE (การสร้างครั้งแรก) ---
function initTable(initialData) {
// ตรวจสอบเพื่อไม่ให้สร้างซ้อน (Idempotent)
if (tableInstance) return;
tableInstance = new TabulatorPlus($tableEl[0], {
data: initialData,
columns: [
{ title: "ID", field: "id", width: 50 },
{ title: "Product", field: "product", width: 200 },
{ title: "Price", field: "price", formatter: "money" },
],
}, "jquery-storage-key");
// หรือจะเก็บไว้ใน jQuery Data เพื่อเรียกใช้จากที่อื่นก็ได้
$tableEl.data("tabulator-instance", tableInstance);
}
// --- FUNCTION: REFRESH (อัปเดตข้อมูล) ---
window.refreshTableData = function(newData) {
if (tableInstance) {
console.log("Refreshing data...");
// ใช้ .setData() เพื่ออัปเดตข้อมูลโดยไม่ต้องวาดตารางใหม่ทั้งหมด
tableInstance.setData(newData);
}
};
// --- FUNCTION: ACTION (เรียกใช้ Method) ---
$("#btn-clear-filter").on("click", function() {
if (tableInstance) {
tableInstance.clearFilter(true);
}
});
// --- FUNCTION: UNMOUNT / DESTROY (การล้างข้อมูล) ---
window.destroyTable = function() {
if (tableInstance) {
console.log("Destroying table...");
// ล้าง Event และ DOM ที่ Tabulator สร้างขึ้น
tableInstance.destroy();
tableInstance = null;
$tableEl.removeData("tabulator-instance");
}
};
// ทดลองรัน
initTable([
{ id: 1, product: "Laptop", price: 35000 },
{ id: 2, product: "Mouse", price: 1200 }
]);
});
💡 คำอธิบายสำหรับการใช้งานแบบ jQuery
- Reused Instance: ผมแนะนำให้ใช้ตัวแปรแบบ
letในขอบเขต ( Scope ) ที่เหมาะสม หรือใช้$el.data('name', instance)ซึ่งเป็นท่ามาตรฐานของ jQuery Plugin เพื่อให้ฟังก์ชันอื่น ๆ ในหน้าเว็บสามารถเข้าถึง Instance เดียวกันได้ - Refresh: การเรียก
tableInstance.setData(data)ใน jQuery จะทำงานได้เร็วมาก และช่วยรักษาสถานะการเลื่อน ( Scroll Position ) ของผู้ใช้ไว้ได้ - Unmount / Destroy: ใน jQuery มักจะไม่ค่อยมีการ Unmount อัตโนมัติเหมือน Framework สมัยใหม่ ( ยกเว้นคุณจะเปลี่ยนหน้าด้วย AJAX ) ดังนั้นควรเรียก
.destroy()เมื่อคุณทำการลบ Element นั้นทิ้งด้วย.remove()เพื่อป้องกัน Memory Leak ครับ - Accessing DOM: สังเกตว่าผมส่ง
$tableEl[0]( ตัวแรกของ jQuery Object ) เข้าไปใน Constructor เพราะTabulatorPlusต้องการ Pure DOM Element ไม่ใช่ jQuery Object ครับ
เปรียบเทียบภาพรวม ( Framework vs jQuery )
| ฟีเจอร์ | Framework ( React / Vue / NG ) | jQuery |
| Lifecycle | จัดการผ่าน Hooks ( Auto ) | จัดการเองด้วยฟังก์ชัน ( Manual ) |
| Data Binding | อัปเดตผ่าน Props / Watch | อัปเดตผ่านฟังก์ชัน setData() |
| State | เก็บใน Component State / Ref | เก็บในตัวแปร Global หรือ .data() |
การทำ Wrapper แบบ TabulatorPlus นี้ช่วยให้คุณเขียนโค้ด jQuery ได้สะอาดขึ้นมาก เพราะไม่ต้องใส่ Config ยาว ๆ ทุกครั้งที่สร้างตารางครับ
อ่านเพิ่มเติม