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});
不确定您的 User
和 UserSubscription
模型是如何设置的,但如果我正确理解您的意图,我认为您也将是新手,然后直接更新订阅值:
user.subscription = newUserSubscription
this.user.next(user);
我有一个用户对象作为我观察到的 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});
不确定您的 User
和 UserSubscription
模型是如何设置的,但如果我正确理解您的意图,我认为您也将是新手,然后直接更新订阅值:
user.subscription = newUserSubscription
this.user.next(user);