Angular/RxJs更新BehaviorSubject值后pairwise检测变更失效如何解决?
解决方法
问题根源
你的代码存在两个核心问题:
Object.assign会直接修改第一个入参的原对象,你直接把this.user.value作为第一个入参,相当于直接修改了BehaviorSubject中存储的原有用户对象,导致旧值被覆盖,pairwise取到的前后两个值永远是同一个对象引用,自然无法比对出差异。- 原赋值逻辑错误,你要更新的是用户的
subscription属性,但现有代码是把newUserSubscription的所有属性直接合并到用户对象的根层级,而不是赋值给subscription字段。
修复代码
修改AuthService中的updateUserSubscription方法,每次更新都生成一个全新的用户对象实例再传给next:
updateUserSubscription(newUserSubscription: UserSubscription): void { const currentUser = this.user.value; // 不存在当前用户时直接终止逻辑 if (!currentUser) return; // 生成全新的用户对象,保留原有属性,仅更新subscription字段 const updatedUser = { ...currentUser, subscription: newUserSubscription }; this.user.next(updatedUser); }
如果你更习惯用Object.assign写法,可以替换成:
const updatedUser = Object.assign({}, currentUser, { subscription: newUserSubscription });
注意事项
如果后续你需要修改subscription内部的属性,也要遵循相同的规则,生成新的subscription对象再赋值,不要直接修改原有subscription的属性,否则同样会出现比对不到变化的问题。
内容的提问来源于stack exchange,提问作者user16831793
相关产品推荐
相关产品推荐

