programing

이벤트 이미터의 올바른 사용 방법은 무엇입니까?

instargram 2023. 5. 12. 20:13
반응형

이벤트 이미터의 올바른 사용 방법은 무엇입니까?

사용자가 자신의 서비스에서 EventEmitter를 사용하는 CustomHttp 내부의 Access EventEmitter Service와 같은 질문을 읽었지만, 이 의견에서 사용하지 말고 대신 Observables를 자신의 서비스에서 직접 사용하도록 제안되었습니다.

저는 또한 이 질문을 읽고 아이에게 이벤트 송신기를 전달하고 구독할 것을 제안합니다.

그렇다면 제 질문은: 이벤트 이미터를 수동으로 구독해야 할까요, 아니면 구독하지 말아야 할까요?어떻게 사용해야 하나요?

TL;DR:

아니요, 수동으로 가입하지 마십시오. 서비스에서 사용하지 마십시오.구성 요소의 이벤트를 내보내는 경우에만 설명서에 나와 있는 대로 사용합니다.앵글의 추상화를 꺾지 마세요.

답변:

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

Event Emiter는 Angular2 추상화이며 구성 요소에서 이벤트를 내보내는 것이 유일한 목적입니다.Rob Wormald의 의견을 인용합니다.

[...] 이벤트 이미터는 실제로 Angular 추상화이므로 구성 요소에서 사용자 지정 이벤트를 내보내는 데만 사용해야 합니다.그렇지 않으면 Rx를 다른 라이브러리처럼 사용합니다.

이는 Event Emitter의 문서에 매우 명확하게 명시되어 있습니다.

지시어 및 구성 요소에서 사용자 지정 이벤트를 내보냅니다.

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

Angular2는 이벤트 이미터가 계속해서 관찰 가능하다는 것을 보장하지 않습니다.즉, 코드가 변경되면 코드를 리팩터링하는 것입니다.해야 하는 는 그것의 API입니다.emit()이미터를 하면 안 .이벤트 이미터를 수동으로 구독해서는 안 됩니다.

위에 언급된 모든 것은 이 워드 벨의 논평(기사를 읽는 것이 권장되며, 그 논평에 대한 답변)에서 더 명확합니다.참조용 인용문

이벤트 이미터가 계속 관찰 가능하다고 기대하지 마십시오!

앞으로 관측 가능한 연산자가 있을 것으로 기대하지 마십시오!

이러한 파일은 곧 더 이상 사용되지 않으며 릴리스 전에 제거될 수 있습니다.

EventEmitter는 자식 구성 요소와 부모 구성 요소 간의 이벤트 바인딩에만 사용합니다.구독하지 마십시오.이러한 메서드를 호출하지 마십시오.만 전화하세요.eve.emit()

그의 발언은 오래전 롭의 발언과 일치합니다.

그렇다면, 어떻게 그것을 적절하게 사용할 수 있을까요?

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

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

거기서 멈춰요...당신은 이미 틀렸어요

이 두 가지 간단한 예가 Event Emitter의 올바른 사용법을 명확히 해주기를 바랍니다.

네, 어서 사용하세요.

EventEmitter는 최종 Angular Core API의 공개 문서화된 유형입니다.기준 여부Observable없음; 된 경우; 없음emit그리고.subscribe방법은 필요한 것에 적합합니다. 그런 다음 사용하십시오.

문서에 명시된 대로:

Rx를 사용합니다.관찰 가능하지만 여기에 지정된 대로 작동할 수 있는 어댑터를 제공합니다. https://github.com/jhusain/observable-spec

사양의 참조 구현을 사용할 수 있으면 해당 구현으로 전환합니다.

은 래서그들은그를 .Observable특정한 방식으로 행동하는 물체처럼, 그들은 그것을 구현하고 공개했습니다.만약 그것이 사용되어서는 안 되는 내부 각도 추상화였다면, 그들은 그것을 공개하지 않았을 것입니다.

특정 유형의 이벤트를 전송하는 이미터가 있으면 유용한 경우가 많습니다.그게 당신의 사용 사례라면, 시도해 보세요.연결된 사양의 참조 구현을 사용할 수 있는 경우, 다른 폴리필과 마찬가지로 드롭인 교체가 되어야 합니다.

사자가전발가기에 .subscribe()함수가 연결된 규격을 따릅니다.반환된 개체는 다음을 포함하도록 보장됩니다.unsubscribe생성기에 대한 모든 참조를 해제하기 위해 호출되어야 하는 메서드(현재 RxJs 개체이지만 실제로는 의존해서는 안 되는 구현 세부 정보임).

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

모든 강력한 단어의 종말과 우울한 예측은 Angular 2의 사전 릴리스 버전에 대한 단일 개발자의 단일 스택 오버플로 코멘트에서 비롯된 것으로 보입니다.

구성 요소 간 상호 작용을 수행하려면 @Input, @Output, EventEmitter 및 Subject가 무엇인지 알아야 합니다.

구성 요소 간의 관계가 상위-하위 또는 그 반대인 경우 이벤트 이미터와 함께 @input & @output을 사용합니다.

@output은 이벤트를 방출하며 이벤트 이미터를 사용하여 방출해야 합니다.

부모 자식 관계가 아니라면..그러면 당신은 과목을 사용하거나 공통 서비스를 통해 사용해야 합니다.

구성 요소 상호 작용을 원할 때는 @Input, @Output, EventEmitter 및 Subject가 무엇인지 알아야 합니다.

구성 요소 간의 관계가 상위-하위 또는 그 반대인 경우 이벤트 이미터와 함께 @input & @output을 사용합니다.

@output은 이벤트를 방출하며 이벤트 이미터를 사용하여 방출해야 합니다.

부모 자식 관계가 아니라면..그러면 당신은 과목을 사용하거나 공통 서비스를 통해 사용해야 합니다.

없습니다. 아니오와 아니오: 예.진실은 중간에 있고 앵귤러의 다음 버전 때문에 두려워할 이유가 없습니다.

논리적인 관점에서 구성 요소가 있고 다른 구성 요소에 어떤 일이 발생했음을 알리려면 이벤트가 실행되어야 하며 이는 사용자(개발자)가 생각하는 방식으로 수행될 수 있습니다.저는 그것을 사용하지 말아야 할 이유와 어떤 대가를 치르더라도 그것을 사용해야 할 이유를 모르겠습니다.또한 이벤트 이미터 이름은 이벤트가 발생했음을 시사합니다.보통 구성요소에서 발생하는 중요한 이벤트에 사용합니다.서비스를 생성하지만 구성 요소 폴더 내에 서비스 파일을 생성합니다.따라서 서비스 파일이 이벤트 관리자 또는 이벤트 인터페이스와 같은 역할을 하므로 현재 구성 요소에 가입할 수 있는 이벤트를 한눈에 파악할 수 있습니다.

알아요..아마도 저는 좀 구식의 개발자일 것입니다.그러나 이는 이벤트 중심 개발 패턴의 일부가 아니라 특정 프로젝트의 소프트웨어 아키텍처 결정의 일부입니다.

다른 사람들은 관찰할 수 있는 것을 직접 사용하는 것이 멋지다고 생각할 수도 있습니다.이 경우 관찰 가능 항목을 직접 수행합니다.당신은 이런 짓을 하는 연쇄 살인범이 아닙니다당신이 사이코패스 개발자가 아니라면, 프로그램이 작동하는 한, 그렇게 하세요.

순수한 구현의 관점에서 볼 때, 그 이후로.emit그리고.subscribe의 공개 인터페이스의 일부입니다.EventEmitter구현에 사용할 수 있습니다.

그것이 원하지 않는다면 행동으로부터 물려받으려는 강제성이 각진 상태에서,Behaviour에 개인적인 회원이었을 수도 있습니다.EventEmitter수업, 뭐 그런 것들...

public class EventEmitter{
  private _behaviour=new Subject<void>();
  private _behaviour$=this._behaviour.asObservable();
  ......
  public emit(){
    _behaviour.emit();
  }
  ....
}

만약 그것이 Behavaour로부터 물려받았지만 그것처럼 행동하지 않는다면, 그것은 위반입니다.liskov's susbstitution principle.

언급URL : https://stackoverflow.com/questions/36076700/what-is-the-proper-use-of-an-eventemitter

반응형