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