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

Angular/Typescript/RxJs: updating value of BehaviorSubject (Object Assign) while observing changes

我有一个用户对象作为我观察到的 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 中,传播运算符是更好的克隆方式,并且非常符合您期望 Object.assign() 用于克隆的方式:

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

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

user.subscription = newUserSubscription this.user.next(user);