私はのような質問を読んだCustomHttp内のEventEmitterサービスにアクセスするユーザーが彼のサービスでEventEmitterを使用しているところですが、彼はこの中で提案されましたコメント直接彼のサービスでObservablesを使用することはできません。
私もこれを読んだ質問このソリューションでは、EventEmitterを子に渡してサブスクライブすることを提案しています。
私の質問は次のとおりです:私は、または私は手動でEventEmitterを購読してはいけませんか?私はそれをどのように使うべきですか?
持つEventEmitterangle2の抽象化であり、その唯一の目的はコンポーネントでイベントを発生させることです。引用するコメントRob Wormaldの
[...] EventEmitterは実際にはAngular抽象であり、コンポーネント内でカスタムイベントを発生させるためだけに使用する必要があります。それ以外の場合は、Rxを他のライブラリと同じように使用してください。
これは、EventEmitterのドキュメントではっきりと述べられています。
ディレクティブとコンポーネントがカスタムイベントを生成するために使用します。
Angular2は、EventEmitterがObservableであり続けることを決して保証しません。つまり、コードが変更された場合には、コードをリファクタリングすることを意味します。私たちがアクセスしなければならない唯一のAPIは、emit()
方法。私たちは手動でEventEmitterに登録するべきではありません。
上記のすべては、このWard Bellのコメント(記事を読むことをお勧めします。回答そのコメントに)。参照のための引用
Observableであり続けているEventEmitterに数えてはいけません!
将来観察される観察可能なオペレータには数えないでください!
これらはすぐに廃止され、リリース前に削除される可能性があります。
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();
}
そこに止まる...あなたはすでに間違っている...
うまくいけば、これらの2つの簡単な例は、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
彼らは特定の方法で行動したようなオブジェクトを実装し、公開しました。それが単に使用すべきでない内角の抽象概念であった場合、それらを公開することはできませんでした。
特定のタイプのイベントを送信するエミッタを持つと便利なことはたくさんあります。それがあなたのユースケースであれば、それに行きましょう。それらがリンクする仕様のリファレンス実装が利用可能な場合、それは他のポリフィルと同様にドロップイン置換でなければなりません。
ジェネレータがあなたに渡すことを確認してください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();
}
}
強く言及された運命と暗闇の予測はすべて、プレリリース版のAngular 2の単一の開発者からの単一のStack Overflowコメントから生じるようです。