159

나는 같은 질문을 읽었다.CustomHttp 내부에서 EventEmitter 서비스에 액세스하십시오.사용자가 자신의 서비스에서 EventEmitter를 사용하지만이논평그것을 사용하지 않고 직접 Observables를 그의 서비스에서 사용하는 것.

나는 또한 이것을 읽었다.의문이 솔루션은 EventEmitter를 자식에게 전달하고 구독 할 것을 제안합니다.

내 질문은 다음과 같습니다. 또는 EventEmitter를 수동으로 구독해야합니까? 어떻게 사용해야합니까?


  • 가능한 중복위임 : EventEmitter 또는 Observable in Angular2 - Günter Zöchbauer
  • 평소와 같이 마크 (Mark)의 대답은 훌륭하지만 사실 설명하지 못했습니다. 나는 그것을 막지 않을 것이 아니라 그의 의견을 먼저 듣고 싶다. @ MarkRajcok 생각? - Eric Martinez
  • 나는 이것을 열어두고 싶다. (나는 여기서 사람들을 가리킬 것이 틀림 없다 - 나는 방금 여기에서 가리킨 다른 대답을 편집했다.). 당신의 대답은 좋은 정보를 가지고 있습니다. 그래도 두 가지 질문 제목이 필요합니다. 다른 하나는 " EventEmitter의 올바른 용도는 무엇입니까? " - Mark Rajcok
  • @MarkRajcok은 제목이 맘에 들지만 현재 답변에 맞지 않으므로 나중에 업데이트하고, 사용법의 예를 추가하고, 그렇게하지 않는 것이 더 합리적인지 확인해 보겠습니다. 귀하의 의견을 보내 주셔서 감사합니다 :) - Eric Martinez
  • @MarkRajcok은 제안 된대로 수정되었습니다 (y), (제목을 복사하여 붙여 넣기, 모든 크레디트). - Eric Martinez

2 답변


267

아니요, 수동으로 구독하면 안됩니다.

EventEmitterangular2 추상화이며 유일한 목적은 구성 요소에서 이벤트를 방출하는 것입니다. 인용문논평Rob Wormald의

[...] EventEmitter는 실제로는 Angular abstraction이며 구성 요소에서 사용자 정의 이벤트를 방출하는 데만 사용해야합니다. 그렇지 않으면 Rx를 마치 다른 라이브러리처럼 사용하십시오.

이것은 EventEmitter의 문서에서 분명히 밝혀졌습니다.

지시문 및 구성 요소가 사용자 정의 이벤트를 내보내는 데 사용합니다.

그것을 사용하는 것에있어 무엇이 잘못 되었습니까?

Angular2는 EventEmitter가 Observable을 계속 유지한다는 것을 결코 보장하지 않습니다. 즉, 변경되면 코드를 리팩터링하는 것을 의미합니다. 우리가 액세스해야하는 유일한 API는emit()방법. 우리는 EventEmitter를 수동으로 구독해서는 안됩니다.

위에 명시된 모든 것이이 병동의 더 명확합니다.논평(기사 읽기를 권장하고대답그 코멘트에). 참조 용 인용

Observable 인 EventEmitter를 믿지 마십시오!

앞으로있을 관찰 가능한 운영자를 믿지 마십시오!

이것들은 곧 비추천 될 것이며 아마 릴리스 전에 제거 될 것입니다.

하위 요소와 상위 구성 요소 간의 이벤트 바인딩에만 EventEmitter를 사용하십시오. 구독하지 마세요. 이러한 방법 중 하나를 호출하지 마십시오. 전화 만eve.emit()

그의 의견은 오래 전에 Rob의 코멘트와 일치합니다.

그래서, 그것을 올바르게 사용하는 방법?

구성 요소에서 이벤트를 내보내는 데 사용하기 만하면됩니다. 다음 예제를 살펴보십시오.

@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!
    }
}

어떻게 사용하지 않습니까?

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

바로 그만 ... 당신은 이미 잘못 ...

이러한 두 가지 간단한 예제를 통해 EventEmitter의 올바른 사용법을 알 수 있기를 바랍니다.

TL, DR대답 :

아니요, 직접 가입하지 말고 서비스에 사용하지 마십시오. 구성 요소에서 이벤트를 방출하는 경우에만 설명서에 표시된대로 사용하십시오. 각도의 추상화를 무시하지 마십시오.


  • 너 무슨 뜻이야?directives : [Child]구성 요소 정의에서? 이 컴파일은 컴파일하는 것, 그리고 그것을 찾을 수 Angular2 설명서에 설명되어 찾으십시오. - themathmagician
  • @ 에릭 : 당신의 예에서 그것을 사용하지 않는 방법은 매우 분명합니다. 왜냐하면 왜 우리는 @ Output & # 39; 데코레이터 서비스? - trungk18
  • @themathmagician 약간의 연구 끝에, 나는 발견했다.이리directives키워드가 사용 중지되었습니다. 사용declarations~에있는 키워드@NgModule지시대로이리또는이리 - cjsimon
  • Toby의 최근 답변에 대한 의견이 있으십니까? 나는 그의 대답이 오늘날 받아 들여지는 것이어야한다고 생각합니다. - Arjan
  • @Eric이 답변을 작성하면 다음과 같이 썼습니다 : & # 39; Ward Bell을 인용하면 & # 39; 곧 출시 될 예정이며 출시 전에 제거 될 것입니다. 그러나 이것은 2 년 전에 말했고 지금 우리는 angular6을 가지고 있습니다. 이 진술은 아직 적용됩니까? 공식 문서에서 EventEmitter는 여전히 subscribe () 메소드를 가지고 있으므로 Google이 Rxjs 과목에서 EE를 기초로 삼고 싶다면 이미 완료했을 것이라고 생각합니다. 그렇다면 원래의 대답은 Angular의 현재 상태에 여전히 잘 맞다고 생각합니까? - Nad G

53

예, 계속 사용하십시오.

EventEmitter~이다.공개, 문서화 된 유형최종 Angular Core API에서 그것이 근거인지의 여부Observable부적절하다. 문서화 된 경우emitsubscribe방법은 필요한 것을 처리 한 다음 계속 사용하십시오.

또한 문서에 명시된 바와 같이 :

Rx.Observable을 사용하지만 여기에 지정된대로 작동하도록하는 어댑터를 제공합니다.https://github.com/jhusain/observable-spec

사양의 참조 구현을 사용할 수있게되면 해당 사양으로 전환하십시오.

그래서 그들은Observable어떤 방식으로 행동 한 것과 같은 물체를 구현하고 공개했습니다. 그것이 단지 사용되어서는 안되는 내부의 앵귤러 추상화 였다면 공개하지 않았을 것입니다.

특정 유형의 이벤트를 보내는 이미 터를 갖는 것이 유용한 경우가 많습니다. 그게 당신의 유스 케이스라면, 그걸로 가라. 연결되는 사양의 참조 구현을 사용할 수있는 경우 다른 Polyfill과 마찬가지로 드롭 인 대체품이어야합니다.

발전기를 통과시켜야합니다.subscribe()함수는 링크 된 스펙을 따 (니다. 반환되는 객체에는unsubscribe생성자에 대한 참조를 없애기 위해 호출해야하는 메소드 (현재는RxJsSubscription목적그러나 그것은 실제로 의존되어서는 안되는 구현 세부 사항이다).

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();
    }
}

강력하게 단어를 쓰는 운명과 우울한 예측은 모두 단일 개발자의 단일 스택 오버플로 (Stack Overflow) 코멘트에서 나온 것으로 보입니다.


  • 이것은 합리적인 것 같습니다 - 다른 누구나 이것에 무게를 달고 싶습니까? 결국 구독은 이벤트 이미 터에 대한 공개 메소드입니다. - Shawson
  • 좋아요, 우리는 자유롭게 사용할 수 있습니다. 그러나이 예제에서 Observable에 비해 EventEmitter를 사용할 실제적인 이유가 있습니까? - Botis
  • Angular v6 및 EventEmmiter에 대한 지원이 중단되거나 삭제되지 않아 사용하기에 안전하다고 말합니다. 그러나 RxJS에서 Observables를 사용하는 방법을 익히는 것이 도움이됩니다. - David Meza

연결된 질문


최근 질문