Bộ phát sự kiện trong Angular

Tram Ho

Khi bạn bắt đầu học Angular, một trong những điều đầu tiên bạn học là cách giao tiếp giữa các components con và components cha.

Luồng dữ liệu đưa vào component của bạn thông qua property bindings, và luồng dữ liệu ra khỏi component của bạn là thông qua event bindings.

Nếu bạn muốn component của mình thông báo cho cha của nó biết về điều gì đó, bạn có thể sử dụng Output decorator với EventEmitter để tạo một sự kiện tùy chỉnh. Ta có ví dụ như sau:

Chúng ta có thể sử dụng Output decorator để gắn nhãn thuộc tính của chúng ta add như một sự kiện mà một component có thể kích hoạt để gửi dữ liệu đến cha của nó.

Và ở component cha có thể lắng nghe một sự kiện như sau:

Angular sẽ đăng ký sự kiện add và gọi phương thức addTodo() với dữ liệu khi component kích hoạt phương thức next().

Vậy EventEmitter là gì?

Nếu bạn nhìn vào đoạn mã dưới đây, bạn sẽ thấy điều gì đó thú vị:

Ta có thể thấy EventEmitter thực chất là một Subject.

Điều đầu tiên bạn có thể thấy từ đoạn mã trên là bạn có thể chuyển một giá trị boolean tới EventEmitter để xác định xem nên gửi các sự kiện theo cách đồng bộ hay không đồng bộ (Mặc định là đồng bộ).

Bạn có sức mạnh của Rx

Bởi vì EventEmittersSubject, chúng ta có thể sử dụng tất cả các tính năng Rx. Ví dụ, chúng tôi muốn phát ra một sự kiện chỉ khi chúng tôi có một giá trị.

Đến đây bạn đã thấy được sức mạnh của nó chưa.

Nhưng điều đó là chưa đủ. Chúng ta cũng có thể sử dụng bất kỳ Subject nào mà mình muốn. Hãy thử sử dụng BehaviorSubject:

EventEmitters !== DOM events

Không giống như DOM events, Các sự kiện tùy chỉnh của Angular không phải là event bubbling. Nó có nghĩa là gì nếu bạn định nghĩa một cái gì đó như thế này:

Bạn chỉ có thể nghe sự kiện toggle TodoComponent ở component cha của nó.

Đoạn mã sau đây sẽ làm việc:

Và đoạn mã sau đây thì không:

Và giải pháp là

  1. Tiếp tục giữ việc chuyển sự kiện lên cây

Trong ví dụ này, điều đó ổn, nhưng có thể gây khó chịu nếu bạn có các components lồng nhau

  1. Sử dụng native DOM events

Bạn có thể tạo native DOM events như sau:

Sự kiện tùy chỉnh được gửi đi bằng cách gọi phương thức DispatchEven(). Chúng ta có thể chuyển dữ liệu cho sự kiện của mình bằng thuộc tính detail.

Event bubbling sẽ hoạt động ở đây, nhưng vấn đề với cách tiếp cận này là chúng ta đã bỏ lỡ cơ hội có thể thực thi cả trong môi trường không có DOM như native mobile, native desktop, web worker or server side rendering.

  1. Shared Service

Chúng ta có thể sử dụng TodoService như 1 message bus. Bạn có thể tìm hiểu thêm về cách tiếp cận này từ tài liệu.

Bởi vì EventEmitters là những observables, chúng ta có thể làm một số điều điên rồ với chúng. Giả sử bạn có một button component và bạn cần biết khi người dùng kết thúc nhấn tất cả x nút và sau đó nhận giá trị mới nhất từ nó.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo