[英]Angular View Component Data Loss during Reload Refresh using 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.