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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用BehaviorSubject处理复杂数据的更改相关的知识,希望对你有一定的参考价值。

假设我有一个服务,它为任何想要获取某些数据的最新版本的组件提供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执行此操作的内置方法?该组件是否应该在收到通知后找出差异?这通常是怎么做的?

答案

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

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

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

以上是关于使用BehaviorSubject处理复杂数据的更改的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 复杂判断的更优雅写法

Angular 6 BehaviorSubject 使用 LocalStorage

使用裸 RxSwift 和 BehaviorSubject 同步模型

找不到模块 'rxjs/subject/BehaviorSubject'

使用 rxjs5 获取 BehaviorSubject 当前值的简单方法

RxJS - BehaviorSubject,onComplete 未调用