2016-10-30 88 views
10

我正在通過official cookbook來學習Angular2。Angular2中的'rxjs/Subject'是什麼?

下面的代碼突然出現了。爲什麼「missionAnnounced $」沒有變量聲明?讓missionAnnounced $ = ... 以下代碼的邏輯是什麼?

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允許二者發佈和訂閱(受試者觀察到的)。因此,使用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主體同時實現ObservableObserver接口(見鏈接瞭解更多的細節主題不同的口味和行爲)。此處使用的標準主題充當管道,並通過其接口Observer接口上的所有值傳遞給它的接口。您在代碼中看到的asObservable函數調用會隱藏接口的實現,所以當您不需要時,不會無意中使用它,即您只能在使用任何常規可觀察值時使用此主題。

相關問題