2016-10-30 14 views
10

私はこのofficial cookbookでAngular2を学んでいます。Angular2で 'rxjs/Subject'とは何ですか?

以下のコードは突然表示されます。なぜ "missionAnnounced $"に変数宣言がないのですか? let missionAnnounced $ = ... 以下のコードの論理は何ですか? Subjectが発行およびサブスクライブ(被写体が観察である)の両方を可能にしながら

import { Injectable } from '@angular/core'; 
import { Subject } from 'rxjs/Subject'; 
@Injectable() 
export class MissionService { 
    // Observable string sources 
    private missionAnnouncedSource = new Subject<string>(); 
    private missionConfirmedSource = new Subject<string>(); 
    // Observable string streams 
    missionAnnounced$ = this.missionAnnouncedSource.asObservable(); 
    missionConfirmed$ = this.missionConfirmedSource.asObservable(); 
    // Service message commands 
    announceMission(mission: string) { 
    this.missionAnnouncedSource.next(mission); 
    } 
    confirmMission(astronaut: string) { 
    this.missionConfirmedSource.next(astronaut); 
    } 
} 
+2

https://github.com/Reactive-Extensions/RxJS – zerkms

答えて

19

Observableのみ、サブスクライブすることを可能にします。したがって、Subjectを使用すると、サービスを出版社の両方の購読者として使用することができます。

@Component({}) 
class ComponentOne { 
    constructor(private service: MissionService) {} 

    onClick() { 
    service.announceMission('mission started'); 
    } 
} 

@Component({}) 
class ComponentTwo { 
    constructor(private service: MissionService) { 
    service.missionAnnounced$.subscribe(mission => console.log(mission)) 
    } 
} 

@Component({}) 
class ComponentThree { 
    constructor(private service: MissionService) { 
    service.missionAnnounced$.subscribe(mission => console.log(mission)) 
    } 
} 

ここで、ミッション発表イベントを購読したいと思うすべての人は、ただ購読することができます。 ComponentOneは、ミッションが発表されたイベントを発表するものになります。

なぜ "missionAnnounced $"に変数宣言がないのですか?

です。 missionAnnounced$は変数名であり、観察可能な形式でSubjectが割り当てられています。クラスメンバ変数を使用しないlet

以下のコードの論理は何ですか?出版社はannounceMissionconfirmMission呼び出しながら

加入者は、観測($変数)に加入します。 missionAnnounced$missionConfirmed$のすべてのユーザは、これらのイベントを受信します。前の回答を補完するために

4

、あなたは以下のSOのリンクで十分な詳細見つける:要するにWhat are the semantics of different RxJS subjects?

を、Rxjs対象はObservable、およびObserverインタフェース(詳細については、リンクを参照の両方を実装異なる味と主題の振る舞い)。ここで使用される標準的なサブジェクトは、パイプとして機能し、Observerインターフェイスで受信するすべての値をObservableインターフェイスに渡します。コード内に表示されるasObservable関数呼び出しでは、Observerインターフェイスの実装が隠されています。想定外のときに誤って使用することはできません。つまり、定期的な観測を使用する場合にのみ使用できます。

関連する問題