Ta đã gọi notification.add(...) vài lần trong loạt này, luôn kiểu đơn giản nhất: một dòng chữ, màu xanh, tự tắt. Nhưng service này làm được nhiều hơn — bốn màu theo mức độ, thông báo dính không tự tắt cho lỗi nghiêm trọng, và cả nút hành động ngay trong toast (kiểu "Thử lại", "Hoàn tác"). Bài này mổ đủ, và phân định khi nào dùng nó thay cho một hộp thoại.
add(message, options)
Lấy service bằng useService("notification"), rồi gọi add(message, options). message là chuỗi hiển thị; options quyết định mọi thứ còn lại:

Hình 1: Ba lời gọi add. Tùy chọn quan trọng: type (success/warning/danger/info — quyết định màu), title (dòng đậm trên đầu), sticky (true = không tự tắt), và buttons (mảng nút hành động, mỗi nút có name, primary, onClick). add trả về một hàm close() để bạn tự đóng toast khi cần.
Ba loại hiện cạnh nhau
Mình gắn ba nút vào bảng điều khiển, mỗi nút bật một loại. Bấm cả ba, chúng xếp chồng ở góc phải:

Hình 2: Ba toast thật, xếp chồng. Xanh (success) và vàng (warning) tự tắt sau ~4 giây. Đỏ (danger) khai sticky: true nên nằm lại cho tới khi người dùng đóng — hợp cho lỗi cần chú ý — và có nút "Thử lại" ngay trong toast (buttons với primary: true), bấm là chạy onClick mà không phải rời màn hình.
sticky và buttons: khi nào cần
sticky: truecho những gì người dùng phải thấy: lỗi kết nối, thao tác thất bại. Toast thường tự tắt sau vài giây — nếu người dùng ngoảnh đi là bỏ lỡ. Đừng lạm dụng: mọi toast đều sticky thì góc màn hình đầy rác và người dùng phải đóng tay từng cái.buttonsbiến toast từ "thông báo một chiều" thành "thông báo có lối thoát": "Thử lại" sau lỗi, "Hoàn tác" sau khi xoá, "Xem" để nhảy tới bản ghi. Nút chạyonClickngay, không chặn màn hình.
notification hay dialog?
Cả hai đều báo cho người dùng, nhưng khác nhau về mức độ chen ngang:
- notification (toast) hiện ở góc, không chặn thao tác. Dùng để báo kết quả của việc vừa xảy ra: đã lưu, có cảnh báo, gặp lỗi. Người dùng liếc thấy rồi làm tiếp.
- dialog (hộp thoại) hiện giữa màn hình, chặn cho tới khi người dùng trả lời. Dùng khi cần một quyết định trước khi đi tiếp: "Bạn chắc chắn xoá?", "Chọn kho xuất hàng".
Quy tắc gọn: cần thông báo → notification; cần câu trả lời → dialog. Nhồi một câu hỏi quan trọng vào toast (dễ bị bỏ qua, tự tắt) là sai chỗ; ngược lại, bắt người dùng bấm OK cho mỗi lần lưu thành công là phiền.
Ba ý mang về
notification.add(message, options)bật toast góc phải, không chặn thao tác.options.type(success/warning/danger/info) quyết định màu; mặc định tự tắt sau ~4 giây;addtrả về hàmclose().sticky: truegiữ toast lại cho lỗi cần chú ý;buttons: [{name, primary, onClick}]gắn nút hành động ("Thử lại", "Hoàn tác") ngay trong toast. Đừng để mọi thứ sticky.- notification để báo, dialog để hỏi. Toast báo kết quả không chặn; hộp thoại đòi một quyết định và chặn màn hình. Chọn đúng theo việc bạn cần người dùng biết hay trả lời.
Nhắc tới hộp thoại — phần sau đi vào dialog service: mở một hộp thoại chặn chứa nội dung tùy ý (kể cả một component OWL riêng), lấy lại kết quả người dùng chọn, và các mẫu xác nhận có sẵn.