使用BehaviorSubject处理复杂数据的更改

问题描述 投票:1回答:1

假设我有一个服务,它为任何想要获取某些数据的最新版本的组件提供BehaviorSubject

export class DataService {    
    private messageSource = new BehaviorSubject<Data>(this.data);
    currentMessage = this.messageSource.asObservable();
}

export class Component implements OnInit {

    message:Data;

    constructor(private data: DataService) { }

    ngOnInit() {
      this.data.currentMessage.subscribe(
        message => {
          this.message = JSON.parse(JSON.stringify(message))
        }
      )
    }
}

数据很复杂:

class Data {
    id:number
    prop1:string
    prop2:Array<{prop1:number, prop2:string}>
}

数据随时间而变化,组件仅关注最新版本的数据。我的问题是:当组件收到通知时,组件如何知道数据的确切变化?

例如,假设prop2中只有一个项目的一个字段发生了变化。每个组件都会获得新数据,但他们不知道究竟发生了什么变化。知道改变了什么将为渲染优化提供许多机会。

是否有使用BehaviorSubject执行此操作的内置方法?该组件是否应该在收到通知后找出差异?这通常是怎么做的?

angular typescript rxjs
1个回答
2
投票

这不是Subjects关心其有效载荷类型的工作,更不用说属性已经改变了。

diff对象还有其他工具,例如:你可能想检查reduce图书馆的lodash,它可以满足你的需要。如果你在网上或在Stackoverflow上搜索deep diff,你会发现更多关于这个问题的信息。

关于您的特定问题,您可以将最新的Data存储在您的组件中,并且每次通过您的主题收到一个新的Data时,您可以使用您选择的工具进行区分,应用您的更改并使用最新的qazxswpoi覆盖存储的qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.