簡體   English   中英

在 Angular 服務中使用 BehaviorSubject?

[英]Using BehaviorSubject in Angular Services?

通讀這篇涵蓋OnPush 更改檢測的文章,它具有以下使用BehaviorSubject加載用戶的服務:

    const ANONYMOUS_USER: User = {
        firstName: '',
        lastName: ''
    };


    @Injectable()
    export class UserService {

    private subject = new BehaviorSubject<User>(ANONYMOUS_USER);

    user$: Observable<User> = this.subject.asObservable();

    loadUser(user:User) {
        this.subject.next(user);
    }
  }

假設subject引用從未用新用戶更新。 換句話說,它堅持初始化時使用的ANONYMOUS_USER狀態。

所有注入UserService並調用 loadUser 的組件都會收到ANONYMOUS_USER的實例。 IIUC 即BehaviorSubject的目的。 它記住當前狀態,以便不同組件可以多次調用loadUser並且它們將始終收到ANONYMOUS_USER

不完全的。

訂閱user$所有組件都將從主題接收 ANONYMOUS_USER 值。

因此,例如,如果組件 A 訂閱,它將立即獲得 ANONYMOUS_USER 值。 如果用戶導航到另一個組件 B,則原始組件 A 將被銷毀。 如果用戶導航回組件 A 並重新訂閱,它將再次獲得 ANONYMOUS_User 值。

這段代碼:

loadUser(user:User) {
    this.subject.next(user);
}

是將新值廣播到可觀察流中。 因此,如果任何組件調用此方法,它們將廣播一個新值……無論它們傳入該方法。

我有一個在這里使用 BehaviorSubject 的完整示例: https : //github.com/DeborahK/MovieHunter-communication/tree/master/MH-Take3

以及使用 getter/setter 而不是 BehaviorSubject 完成相同任務的代碼: https : //github.com/DeborahK/MovieHunter-communication/tree/master/MH-Take4

編輯:

Subject 的主要目的是向訂閱者廣播事件。 它允許組件調用一個方法(在本例中為loadUser )並傳遞一個值。 然后將該值廣播給所有訂閱者。

如果您使用數據綁定,在大多數情況下不需要主題。 那是因為 Angular 的變更檢測會自動提供通知。

BehaviorSubject 是一種特殊類型的主題,它具有初始值並在訂閱者訂閱時向訂閱者提供該初始值。 如果您需要主題“記住”其最后一個值,則通常使用它代替主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM