277

ユーザーが自分のサービスで EventEmitter を使用する CustomHttp内の Access EventEmitter Service のような質問を読みましたが、このコメント では、それを使用せず、代わりに Observables をサービスで直接使用するように提案されました。

また、ソリューションが EventEmitter を子に渡してサブスクライブすることを提案しているこの質問も読み ました。

私の質問は次のとおりです: EventEmitter を手動でサブスクライブする必要がありますか? どのように使用すればよいですか?

4

6 に答える 6

396

TL;DR :

いいえ、手動でサブスクライブしないでください。サービスで使用しないでください。ドキュメントに示されているように、コンポーネントでイベントを発行するためにのみ使用してください。angularの抽象化を無効にしないでください。

答え:

いいえ、手動で購読しないでください。

EventEmitterは angular2 の抽象化であり、その唯一の目的はコンポーネントでイベントを発行することです。Rob Wormald からのコメントの引用

[...] EventEmitter は実際には Angular の抽象化であり、ほとんどの場合、コンポーネントでカスタム イベントを発行するためにのみ使用する必要があります。それ以外の場合は、他のライブラリであるかのように Rx を使用してください。

これは、EventEmitter のドキュメントで明確に述べられています。

ディレクティブおよびコンポーネントで使用して、カスタム イベントを発行します。

使って何が悪い?

Angular2 は、EventEmitter が引き続き Observable であることを保証しません。つまり、コードが変更された場合はコードをリファクタリングするということです。アクセスする必要がある唯一の API は、そのemit()メソッドです。EventEmitter を手動でサブスクライブするべきではありません。

上記のすべては、この Ward Bell のコメントでより明確になります (記事とそのコメントへの回答を読むことをお勧めします)。参考までに引用

EventEmitter が Observable であり続けることに期待しないでください。

これらの Observable オペレーターが将来存在することを期待しないでください。

これらは間もなく廃止され、リリース前に削除される可能性があります。

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 の適切な使用法が明確になることを願っています。

于 2016-03-18T05:20:38.550 に答える