2016-10-30 3 views
10

Я изучаю Angular2 этим official cookbook.Что такое 'rxjs/Subject' в Angular2?

Приведенный ниже код просто неожиданно появляется. Почему «missionAnnounced $» не имеет объявления переменной? let 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

Какова логика приведенного ниже кода?

Подписчиков подписаться на наблюдаемые (в $ переменных), в то время как издатель назвать announceMission и confirmMission. Все абоненты missionAnnounced$ и missionConfirmed$, соответственно, получат эти события.

4

В дополнение предыдущего ответа, вы найдете широкие детали в следующей С.О. ссылки: What are the semantics of different RxJS subjects?

Короче говоря, субъект Rxjs реализует как Observable и интерфейс Observer (ссылка для получения дополнительной информации об различные вкусы и поведение субъекта). Используемый здесь стандартный объект действует как труба и передает через свой интерфейс Observable все значения, которые он получает на своем интерфейсе Observer. Вызов функции asObservable, который вы видите в коде, скрывает реализацию интерфейса Observer, поэтому вы не можете непреднамеренно использовать его, когда вы тоже не предполагаете, т. Е. Вы можете использовать этот объект только в том случае, если используете обычный наблюдаемый.

Смежные вопросы