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

时间:2018-09-15 22:24:08

标签: angular typescript rxjs

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

1 个答案:

答案 0 :(得分:2)

display = this.getWindowManager().getDefaultDisplay(); display.getSize(size); int width = size.x; int height = size.y; //cardWidHigh 0->width , 1 ->height. cardWidHigh[0] = (int) (width / (rowsCols[1] + .25)); cardWidHigh[1] = (height / (rowsCols[0] + 2)); 不必关心有效负载的类型,更不用说更改了哪些属性。

还有其他Subjects个对象的工具,例如您可能需要检查diff库中的reduce,以满足您的需要。如果您在网络上或Stackoverflow上的lodash上搜索,将会找到更多有关此问题的信息。

关于您的特定问题,您可以将最新的deep diff存储在组件中,并且每次通过主题收到新的Data时,请使用您选择的工具对其进行 diff 申请您所做的更改,并用最新的值覆盖存储的Data