나는 같은 질문을 읽었다.CustomHttp 내부에서 EventEmitter 서비스에 액세스하십시오.사용자가 자신의 서비스에서 EventEmitter를 사용하지만이논평그것을 사용하지 않고 직접 Observables를 그의 서비스에서 사용하는 것.
나는 또한 이것을 읽었다.의문이 솔루션은 EventEmitter를 자식에게 전달하고 구독 할 것을 제안합니다.
내 질문은 다음과 같습니다. 또는 EventEmitter를 수동으로 구독해야합니까? 어떻게 사용해야합니까?
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 설명서에 설명되어 찾으십시오. - themathmagiciandirectives
키워드가 사용 중지되었습니다. 사용declarations
~에있는 키워드@NgModule
지시대로이리또는이리 - cjsimon
EventEmitter
~이다.공개, 문서화 된 유형최종 Angular Core API에서 그것이 근거인지의 여부Observable
부적절하다. 문서화 된 경우emit
과subscribe
방법은 필요한 것을 처리 한 다음 계속 사용하십시오.
또한 문서에 명시된 바와 같이 :
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) 코멘트에서 나온 것으로 보입니다.