Thời gian dùng thử đã hết!
Phần mềm đã vượt quá 15 ngày dùng thử miễn phí. Vui lòng nhập mã bản quyền (License Key) để tiếp tục sử dụng iTeach.
Bài 19. Xây dựng Ứng dụng Quản lý toàn diện (SPA)
1. Kiến thức bài học chuyên sâu
1. Mô hình SPA (Single Page Application) là gì?
Trong các trang web kiểu cũ, mỗi lần bạn bấm "Lưu" hoặc "Chuyển trang", màn hình sẽ chớp trắng một cái để tải lại toàn bộ nội dung. Với SPA, mọi thao tác (Thêm, Xóa, Sửa, Đọc) đều diễn ra trên một trang duy nhất. Dữ liệu được gửi và nhận ngầm ở chế độ nền. Màn hình của người dùng không bao giờ bị tải lại, mang đến cảm giác mượt mà như một phần mềm cài đặt trên máy tính (VD: Facebook, Gmail đều là SPA).
2. Tư duy xử lý Bất đồng bộ (Asynchronous) của google.script.run
Khi JavaScript ở trình duyệt gọi Apps Script (qua google.script.run), nó giống như bạn gọi món ở nhà hàng. Bạn order xong, nhân viên đi vào bếp (Server), còn bạn vẫn có thể ngồi lướt điện thoại (Browser không bị đơ). Khi nấu xong, nhân viên mang món ra (đây chính là lúc withSuccessHandler được kích hoạt).
3. Vòng tuần hoàn dữ liệu (The CRUD Cycle):
- Bước 1 (Khởi tạo): Vừa mở trang, chạy hàm
taiDuLieuBang(). - Bước 2 (Tương tác): Người dùng điền Form -> Bấm Lưu.
- Bước 3 (Đóng vòng lặp - Quan trọng nhất): Bắt sự kiện
withSuccessHandlerbáo lưu thành công. Ngay tại đây, ta gọi lại hàmtaiDuLieuBang()của Bước 1 để vẽ lại bảng với dữ liệu mới nhất.
2. Bài tập mẫu & Giải phẫu Mã nguồn
Ví dụ: Hệ thống Đăng ký và Quản lý Đề tài KHKT
Đề bài: Xây dựng một giao diện gồm 2 nửa. Trái: Form nhập liệu đề tài KHKT. Phải: Bảng danh sách đề tài. Yêu cầu nhập xong bên trái, bên phải tự động hiện dữ liệu mới.
Phần 1: Code Back-end (Code.gs)
functionlayDanhSachTuSheet() {letsheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("KHKT");// Bỏ qua dòng 1 (tiêu đề), lấy từ dòng 2returnsheet.getRange(2, 1, sheet.getLastRow() - 1, 3).getValues(); }functionluuDeTaiMoi(formObj) {letsheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("KHKT"); sheet.appendRow([formObj.tenDT, formObj.tenHS, formObj.linhVuc]);return"Thành công"; }
layDanhSachTuSheet làm nhiệm vụ Read (Đọc), trả về một mảng 2 chiều. Còn luuDeTaiMoi làm nhiệm vụ Create (Tạo mới), lấy Object từ Form và nối thêm (append) vào dòng cuối cùng của Sheet.
Phần 2: Code Front-end (JavaScript trong file HTML)
// 1. Tự động tải dữ liệu khi trang web vừa load xongwindow.onload=taiDuLieuBang;functiontaiDuLieuBang() {google.script.run.withSuccessHandler(veBang).layDanhSachTuSheet(); }functionveBang(data) {lettbody = document.getElementById("myTableBody"); tbody.innerHTML ="";// Xóa dữ liệu cũ trước khi đắp cái mớidata.forEach((row, index) => { tbody.innerHTML +=`<tr><td>; }); }${index+1}</td><td>${row[0]}</td><td>${row[1]}</td></tr>`// 2. Xử lý khi Submit FormfunctionxuLyThemMoi(formObj) {google.script.run.withSuccessHandler(function() { document.getElementById("formKHKT").reset();// Xóa trắng form để nhập tiếptaiDuLieuBang();// GỌI LẠI HÀM VẼ BẢNG: Chìa khóa của SPA nằm ở đây!}) .luuDeTaiMoi(formObj); }
taiDuLieuBang(); bên trong withSuccessHandler của hàm lưu. Có nghĩa là: "Khi Server báo đã cất dữ liệu thành công, Client tự động gọi lại lệnh kéo dữ liệu mới nhất về và vẽ lại từ đầu". Ta phải gọi tbody.innerHTML = "" để tránh tình trạng dữ liệu cũ bị vẽ lặp lại (nhân bản).
Trải nghiệm Ứng dụng thực tế: Quản lý Đề tài KHKT
Hãy thử điền form bên trái và bấm Gửi, bạn sẽ thấy bảng bên phải tự làm mới mà trình duyệt không hề bị load lại.
Đăng ký đề tài mới
Danh sách đang theo dõi
3. Bài tập tự luyện
Bài tập: Xây dựng Hệ thống Sổ Đầu Bài Điện Tử
Đề bài: Vận dụng kiến thức SPA để tạo sổ đầu bài cho giáo viên bộ môn.
- Khởi tạo: Khi mở web, gọi Google Sheets lấy dữ liệu của tất cả các tiết dạy trong ngày hôm nay và vẽ ra bảng.
- Cập nhật (Form): Giáo viên chọn Lớp, Môn, Tiết, Tên bài dạy và Xếp loại (A, B, C, D) rồi bấm Lưu.
- Thử thách nâng cao (UX): Sau khi bảng tự động refresh để hiện tiết học vừa nhập, hãy viết code CSS/JS để đổi màu nền (Highlight) của hàng mới thêm thành màu vàng sáng trong 3 giây, sau đó từ từ mờ đi thành màu trắng. (Gợi ý: Dùng `setTimeout` trong JS kết hợp đổi `style.backgroundColor`).