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:

Ảnh chụp đoạn mã nền tối minh hoạ cách dùng notification service, lấy service bằng useService notification, chú thích type quyết định màu và mặc định tự tắt sau khoảng 4 giây, gọi add với chuỗi Đã lưu thay đổi thẻ thành viên cùng options type success title Thành công, gọi add lần hai với chuỗi Có 1 thẻ sắp hết hạn tuần này type warning title Cảnh báo, và gọi add lần ba với chuỗi Không kết nối được máy in thẻ options type danger title Lỗi sticky true và mảng buttons chứa một nút tên Thử lại primary true với onClick gọi this thuLai, cuối cùng chú thích add trả về một hàm close để tự đóng khi cần

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:

Ảnh chụp thật ba thông báo toast xếp chồng ở góc trên bên phải màn hình Odoo 19, toast trên cùng viền xanh lá nội dung Thành công Đã lưu thay đổi thẻ thành viên, toast giữa viền vàng cam nội dung Cảnh báo Có 1 thẻ sắp hết hạn trong tuần này, toast dưới viền đỏ nội dung Lỗi Không kết nối được máy in thẻ kèm một nút Thử lại màu xanh dương ngay trong toast, bên trái là bảng điều khiển với ba nút Thành công Cảnh báo và Lỗi sticky kèm nút

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: true cho 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.
  • buttons biế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ạy onClick ngay, 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ề

  1. 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; add trả về hàm close().
  2. sticky: true giữ 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.
  3. 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.