2016-10-30 21 views
10

Tôi đang học Angular2 theo số official cookbook này.'rxjs/Subject' là gì trong Angular2?

Mã bên dưới chỉ xuất hiện đột ngột. Tại sao "missionAnnounced $" không có khai báo biến? let missionAnnounced $ = ... Logic của mã dưới đây là gì?

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

Trả lời

19

Một Observable chỉ cho phép đăng ký, trong khi một Subject cho phép cả hai xuất bản và đăng ký (một chủ đề là một thể quan sát được). Vì vậy, việc sử dụng số Subject cho phép dịch vụ của bạn được sử dụng làm cả nhà xuất bản một người đăng ký.

@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)) 
    } 
} 

Giờ mọi người muốn đăng ký sự kiện được công bố thông báo đều có thể đăng ký. Các ComponentOne sẽ là một trong những phát ra nhiệm vụ công bố sự kiện.

Tại sao "missionAnnounced $" không có khai báo biến?

. missionAnnounced$ là tên biến, được gán Subject ở dạng quan sát được. Biến thành viên nhóm không sử dụng let

Logic của mã bên dưới là gì?

thuê bao đăng ký với quan sát (các $ biến), trong khi các nhà xuất bản gọi announceMissionconfirmMission. Tất cả người đăng ký lần lượt là missionAnnounced$missionConfirmed$ sẽ nhận được các sự kiện đó.

4

Để bổ sung cho câu trả lời trước đó, bạn sẽ tìm thấy chi tiết phong phú trong SO đường dẫn sau: What are the semantics of different RxJS subjects?

Nói tóm lại, một chủ đề Rxjs thực hiện cả Observable, và giao diện Observer (xem liên kết để biết thêm chi tiết về hương vị và hành vi khác nhau của chủ đề). Đối tượng tiêu chuẩn được sử dụng ở đây hoạt động như một đường ống và đi qua giao diện Observable tất cả các giá trị mà nó nhận được trên giao diện Observer của nó. Cuộc gọi hàm asObservable mà bạn thấy trong mã ẩn việc triển khai giao diện Observer, vì vậy bạn không thể vô tình sử dụng nó khi bạn không được phép, tức là bạn chỉ có thể sử dụng chủ đề này khi bạn sử dụng bất kỳ quan sát thường xuyên nào.

Các vấn đề liên quan