我正在通过这个 official cookbook 学习 Angular2 .
下面的代码是突然出现的。为什么“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);
}
}
Observable
只允许订阅,而 Subject
允许发布和订阅(一个主题是一个 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
将发出任务宣布事件。
Why "missionAnnounced$" doesn't have a variable declaration?
确实如此。 missionAnnounced$
是变量名,以其可观察的形式分配给 Subject
。类成员变量不要使用let
What is the logic of the below code?
订阅者订阅可观察对象($
变量),而发布者调用announceMission
和confirmMission
。 missionAnnounced$
和 missionConfirmed$
的所有订阅者将分别收到这些事件。