Angular/Typescript/RxJs:在观察变化的同时更新BehaviorSubject(Object Ass



我有一个用户对象,作为我观察到的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;
}
}

你能告诉我如何正确地为我当前的用户对象分配新的值,这样我就可以比较可观察对象中的值吗?

谢谢!

如果使用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中,spread操作符是一种更好的克隆方式,与您期望Object.assign()用于克隆的方式非常一致:

const user = {...this.user.value});

不确定您的UserUserSubscription型号是如何设置的,但如果我正确理解您的意图,我认为您也将是新手,然后直接更新订阅值:

user.subscription = newUserSubscriptionthis.user.next(user);

最新更新