Việc sử dụng đúng cách của một EventEuctor là gì?


224

Tôi đã đọc các câu hỏi như Dịch vụ truy cập sự kiện bên trong CustomHttp nơi người dùng sử dụng EventEuctor trong dịch vụ của mình, nhưng anh ấy được đề nghị trong nhận xét này không sử dụng dịch vụ đó và sử dụng thay thế trực tiếp trong các dịch vụ của mình.

Tôi cũng đọc câu hỏi này trong đó giải pháp gợi ý để truyền EventEuctor cho trẻ và đăng ký nó.

Câu hỏi của tôi là: Tôi nên hay không nên đăng ký thủ công vào EventEuctor? Tôi nên sử dụng nó như thế nào?



2
Câu trả lời hay của Mark, như thường lệ, nhưng thực ra anh ta không giải thích lý do tại sao tôi giải thích. Tôi không chống lại việc đóng nó, nhưng tôi muốn ý kiến ​​của anh ấy trước. @MarkRajcok nghĩ sao?
Eric Martinez

Tôi muốn giữ cho điều này mở (và tôi chắc chắn tôi sẽ chỉ cho mọi người ở đây - Tôi chỉ chỉnh sửa câu trả lời khác của tôi để chỉ ở đây!). Câu trả lời của bạn có một chút thông tin bổ sung. Tôi muốn có hai tiêu đề câu hỏi mặc dù ... cái còn lại là "Việc sử dụng đúng sự kiện là gì?"
Mark Rajcok 18/03/2016

@MarkRajcok Tôi thích tiêu đề đó nhưng nó không phù hợp với câu trả lời hiện tại, vì vậy tôi sẽ đảm bảo cập nhật nó sau, thêm ví dụ về cách sử dụng và làm thế nào để nó không có ý nghĩa hơn. Cảm ơn phản hồi của bạn :)
Eric Martinez

@MarkRajcok đã chỉnh sửa theo đề xuất (y), (sao chép và dán tiêu đề được đề xuất, tất cả các khoản tín dụng cho bạn).
Eric Martinez

Câu trả lời:


342

TL; DR :

Không, không đăng ký thủ công với họ, không sử dụng chúng trong các dịch vụ. Sử dụng chúng như được hiển thị trong tài liệu chỉ để phát ra các sự kiện trong các thành phần. Đừng đánh bại sự trừu tượng của góc cạnh.

Câu trả lời:

Không, bạn không nên đăng ký thủ công với nó.

EventEuctor là một bản tóm tắt angular2 và mục đích duy nhất của nó là phát ra các sự kiện trong các thành phần. Trích dẫn một bình luận từ Rob Wormald

[...] EventEuctor thực sự là một sự trừu tượng hóa góc cạnh và chỉ được sử dụng khá nhiều để phát ra các Sự kiện tùy chỉnh trong các thành phần. Mặt khác, chỉ sử dụng Rx như thể nó là bất kỳ thư viện khác.

Điều này được nêu thực sự rõ ràng trong tài liệu của EventEuctor.

Sử dụng bởi các chỉ thị và các thành phần để phát ra các Sự kiện tùy chỉnh.

Có gì sai khi sử dụng nó?

Angular2 sẽ không bao giờ đảm bảo với chúng tôi rằng EventEuctor sẽ tiếp tục là một vật quan sát được. Vì vậy, điều đó có nghĩa là tái cấu trúc mã của chúng tôi nếu nó thay đổi. API duy nhất chúng ta phải truy cập là emit()phương thức của nó . Chúng ta không bao giờ nên đăng ký thủ công vào EventEuctor.

Tất cả những điều đã nêu ở trên rõ ràng hơn trong bình luận của Ward Bell này (nên đọc bài báo và câu trả lời cho nhận xét đó). Trích dẫn để tham khảo

KHÔNG được tính vào EventEuctor tiếp tục là một Quan sát!

KHÔNG dựa vào những nhà khai thác quan sát được trong tương lai!

Những thứ này sẽ bị loại bỏ sớm và có thể được gỡ bỏ trước khi phát hành.

Chỉ sử dụng EventEuctor để liên kết sự kiện giữa thành phần con và thành phần cha. Đừng đăng ký nó. Đừng gọi bất kỳ phương pháp nào. Chỉ gọieve.emit()

Nhận xét của ông phù hợp với nhận xét của Rob từ lâu.

Vậy, làm thế nào để sử dụng đúng cách?

Đơn giản chỉ cần sử dụng nó để phát ra các sự kiện từ thành phần của bạn. Hãy xem một ví dụ sau đây.

@Component({
    selector : 'child',
    template : `
        <button (click)="sendNotification()">Notify my parent!</button>
    `
})
class Child {
    @Output() notifyParent: EventEmitter<any> = new EventEmitter();
    sendNotification() {
        this.notifyParent.emit('Some value to send to the parent');
    }
}

@Component({
    selector : 'parent',
    template : `
        <child (notifyParent)="getNotification($event)"></child>
    `
})
class Parent {
    getNotification(evt) {
        // Do something with the notification (evt) sent by the child!
    }
}

Làm thế nào để không sử dụng nó?

class MyService {
    @Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}

Dừng lại ở đó ... bạn đã sai ...

Hy vọng rằng hai ví dụ đơn giản này sẽ làm rõ cách sử dụng hợp lý của EventEuctor.


1
Ý của bạn là gì: directives : [Child]trong định nghĩa Thành phần? Điều này dường như không biên dịch, và tôi không thể tìm thấy nó được mô tả trong tài liệu Angular2.
themathmagician

1
@Eric: Cách không sử dụng nó trong ví dụ của bạn rất rõ ràng, tại sao chúng ta cần trang trí '@Output' trong một dịch vụ?
trungk18

1
@themathmagician Sau một chút nghiên cứu, tôi thấy đâydirectivestừ khóa từ đó đã được phản đối. Sử dụng declarationstừ khóa @NgModuletheo hướng dẫn tại đây hoặc tại đây
cjsimon

5
Bất kỳ bình luận về câu trả lời gần đây hơn của Toby? Tôi đoán câu trả lời của anh ấy nên được chấp nhận ngày nay.
Arjan

7
@Eric Khi bạn viết câu trả lời này, bạn đã viết: 'Những thứ này sẽ bị loại bỏ sớm và có thể bị xóa trước khi phát hành', trích dẫn Ward Bell. Nhưng điều này đã được nêu 2 năm trước và bây giờ chúng ta có ang6. Liệu tuyên bố này vẫn áp dụng bây giờ? Tôi tiếp tục thấy trong tài liệu chính thức rằng EventEuctor vẫn có phương thức đăng ký (), vì vậy tôi nghĩ rằng nếu Google muốn dừng lại dựa trên EE trên các chủ đề Rxjs thì họ đã thực hiện nó. Vì vậy, bạn có nghĩ rằng câu trả lời ban đầu của bạn vẫn phù hợp với tình trạng Angular hiện tại?
Nad G

100

Vâng, hãy tiếp tục và sử dụng nó.

EventEmitterlà một loại công khai, được ghi lại trong API Angular Core cuối cùng. Có hay không dựa trên Observablenó là không liên quan; nếu tài liệu emitsubscribephương pháp của nó phù hợp với những gì bạn cần, thì hãy tiếp tục và sử dụng nó.

Như đã nêu trong các tài liệu:

Sử dụng Rx.Observable nhưng cung cấp bộ điều hợp để làm cho nó hoạt động như được chỉ định ở đây: https://github.com/jhusain/observable-spec

Sau khi có sẵn một tham chiếu của thông số kỹ thuật, hãy chuyển sang nó.

Vì vậy, họ muốn một Observableđối tượng giống như hành xử theo một cách nhất định, họ đã thực hiện nó và công khai nó. Nếu nó chỉ đơn thuần là một sự trừu tượng góc cạnh không nên được sử dụng, thì họ đã không công khai nó.

Có nhiều lúc rất hữu ích khi có một bộ phát gửi các sự kiện thuộc một loại cụ thể. Nếu đó là trường hợp sử dụng của bạn, đi cho nó. Nếu / khi một triển khai tham chiếu của thông số kỹ thuật mà họ liên kết đến có sẵn, thì đó phải là một sự thay thế thả xuống, giống như với bất kỳ polyfill nào khác.

Chỉ cần chắc chắn rằng trình tạo bạn chuyển đến subscribe()hàm theo thông số kỹ thuật được liên kết. Đối tượng trả về được đảm bảo có một unsubscribephương thức nên được gọi để giải phóng mọi tham chiếu đến trình tạo (đây hiện là đối tượng RxJsSubscription nhưng đó thực sự là một chi tiết triển khai không nên phụ thuộc vào).

export class MyServiceEvent {
    message: string;
    eventId: number;
}

export class MyService {
    public onChange: EventEmitter<MyServiceEvent> = new EventEmitter<MyServiceEvent>();

    public doSomething(message: string) {
        // do something, then...
        this.onChange.emit({message: message, eventId: 42});
    }
}

export class MyConsumer {
    private _serviceSubscription;

    constructor(private service: MyService) {
        this._serviceSubscription = this.service.onChange.subscribe({
            next: (event: MyServiceEvent) => {
                console.log(`Received message #${event.eventId}: ${event.message}`);
            }
        })
    }

    public consume() {
        // do some stuff, then later...

        this.cleanup();
    }

    private cleanup() {
        this._serviceSubscription.unsubscribe();
    }
}

Tất cả các dự đoán từ ngữ và u ám được diễn đạt mạnh mẽ dường như xuất phát từ một nhận xét Stack Overflow duy nhất từ ​​một nhà phát triển duy nhất trên phiên bản tiền phát hành của Angular 2.


2
Điều này nghe có vẻ hợp lý - bất cứ ai khác muốn cân nhắc về điều này? đăng ký là một phương thức công khai trên một trình phát sự kiện?
Shawson

Ok, nó công khai vì vậy chúng tôi có thể sử dụng nó miễn phí. Nhưng có bất kỳ lý do thực tế nào để sử dụng EventEuctor trên Observable trong ví dụ này không?
Botis

6
Hiện tại chúng tôi đang sử dụng Angular v6 và EventEmmiter không bị phản đối hoặc bị xóa nên tôi nói rằng nó an toàn khi sử dụng. Tuy nhiên, tôi thấy lợi ích của việc học cách sử dụng Đài quan sát từ RxJS.
David Meza

Tôi thấy đó là "nếu bạn đang sử dụng EventEuctor bên ngoài @Output, không cần phải vội vàng thay đổi nó thành một thứ khác vì api là ATM ổn định"; nếu bạn có thời gian hoặc api nghỉ, bạn sẽ phải thay đổi nó (nhưng hãy nhớ rằng để góc cạnh thay đổi một api ổn định công cộng (phát ra và đăng ký) là không phổ biến). Cũng tuân theo api công khai, không truy cập các phương thức của Chủ đề hoặc Có thể quan sát được mà không được xác định trong EventEuctor để ở bên an toàn hơn
axitghost

1
Giả định rằng một cái gì đó an toàn để sử dụng vì "không bị xóa khỏi Angular" hoặc "tài liệu tốt" là sai cũng như chính sách nono được đề xuất ở trên. Bạn tạo một dự án không phải vì lý do của các phiên bản góc cạnh trong tương lai. Có rất nhiều nền tảng không được bảo đảm bên ngoài vẫn hoạt động trên web. Phiên bản của khung không làm cho các nhà phát triển đang làm việc trên các nền tảng đó ít nhà phát triển hoặc nhà phát triển loại B.
Claudio Ferraro

4

Khi bạn muốn có tương tác thành phần chéo, thì bạn cần biết @Input, @Output, EventEuctor và Chủ đề là gì.

Nếu mối quan hệ giữa các thành phần là cha mẹ hoặc ngược lại, chúng tôi sử dụng @input & @output với trình phát sự kiện ..

@output phát ra một sự kiện và bạn cần phải phát ra bằng cách sử dụng trình phát sự kiện.

Nếu đó không phải là mối quan hệ cha mẹ con .. thì bạn phải sử dụng các đối tượng hoặc thông qua một dịch vụ chung.


0

Không có: nono và no: yesyes. Sự thật nằm ở giữa Và không có lý do gì để sợ hãi vì phiên bản tiếp theo của Angular.

Từ quan điểm logic, nếu Bạn có Thành phần và Bạn muốn thông báo cho các thành phần khác rằng có sự cố xảy ra, một sự kiện sẽ được kích hoạt và điều này có thể được thực hiện theo bất kỳ cách nào Bạn (nhà phát triển) nghĩ rằng nó nên được thực hiện. Tôi không thấy lý do tại sao không sử dụng nó và tôi không thấy lý do tại sao phải sử dụng nó bằng mọi giá. Ngoài ra, tên EventEuctor gợi ý cho tôi một sự kiện đang diễn ra. Tôi thường sử dụng nó cho các sự kiện quan trọng xảy ra trong Thành phần. Tôi tạo Dịch vụ nhưng tạo tệp Dịch vụ bên trong Thư mục Thành phần. Vì vậy, tệp Dịch vụ của tôi trở thành một loại Trình quản lý sự kiện hoặc Giao diện sự kiện, vì vậy tôi có thể tìm hiểu sơ qua về sự kiện nào tôi có thể đăng ký trên thành phần hiện tại.

Tôi biết..Có thể tôi là một nhà phát triển lỗi thời. Nhưng đây không phải là một phần của mô hình phát triển Sự kiện hướng, đây là một phần của các quyết định kiến ​​trúc phần mềm của dự án cụ thể của Bạn.

Một số kẻ khác có thể nghĩ rằng sử dụng trực tiếp Đài quan sát là tuyệt vời. Trong trường hợp đó hãy tiếp tục với Đài quan sát trực tiếp. Bạn không phải là một kẻ giết người hàng loạt làm điều này. Trừ khi bạn là nhà phát triển tâm lý, cho đến nay Chương trình hoạt động, hãy làm điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.