我有一個用戶物件作為我觀察到的 BehaviourSubject。我想知道我的用戶的特定值是否已更改。
我的代碼不起作用,我認為這是因為我為用戶分配新物件值的方式。我顯然覆寫了我的 BehaviorSubject 的舊值和新值,因此我總是會比較同一個物件?
export interface User {
id: string;
username: string;
isBanned: boolean;
subscription?: UserSubscription;
}
export class AuthService {
public readonly user$: Observable<User| undefined> = this.user.asObservable();
user: BehaviorSubject<User| undefined> = new BehaviorSubject<User| undefined>(undefined);
updateUserSubscription(newUserSubscription: UserSubscription): void {
// Here I simply want to update the subscription-Object of my user
this.user.next(Object.assign(this.user.value, newUserSubscription));
}
}
export class MemberService {
user?: User;
private subscription?: Subscription;
constructor(public auth: AuthService) {
// Here I simply want to detect subscription changes
this.subscription = this.auth.user$.pipe(
pairwise(),
filter(users => this.detectSubscriptionChange(users[0], users[1]))
).subscribe(([user1, user2] => { // some code ... })
}
detectSubscriptionChange(user1: User | undefined, user2: User | undefined): boolean {
//subscription status is always the same, as the objects are always the same...
return user1?.subscription?.status !== user2?.subscription?.status;
}
}
你能告訴我如何正確地為我當前的用戶物件分配新值,以便我可以比較 observable 中的值嗎?
謝謝!
uj5u.com熱心網友回復:
如果使用Object.assign()克隆,您需要將第一個引數中的“目標”設定為空物件{},然后將用戶物件“分配”給新的空物件,該物件代表新的用戶克隆。
const user = Object.assign({}, this.user.value);
目前,您只是將訂閱物件“分配”給當前用戶。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
不過,在最新的 JS / Typescript 中,擴展運算子是更好的克隆方式,并且非常符合您期望Object.assign()的克隆作業方式:
const user = {...this.user.value});
不確定您的User和UserSubscription模型是如何設定的,但如果我正確理解了您的意圖,我認為您也將是新手,然后直接更新訂閱值:
user.subscription = newUserSubscription
this.user.next(user);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/362681.html
標籤:javascript 有角的 打字稿 rxjs 可观察的
