// 数组class RenderIterableChange{ private _differ: IterableDiffer ; private data: NgIterable ; private change$: Subject > = new Subject(); constructor( // 数据 data: { [key: number]: any }, // 变化 private _differs: IterableDiffers ) { // 初始化时先执行一次changes this.doChanges(data, true); } private doCheck(): void { if (this._differ) { let changes = this._differ.diff(this.data); if (changes) { // 变化监听 this.change$.next(changes); } } } // 首次调用一次 之后每次变化调用 doChanges(data: any, isFirst: boolean = false): void { // 如果不是首次变化 先检测变化 if (!isFirst) { this.doCheck(); } this._differ = this._differs.find(data).create(); this.data = data; // 如果是首次变化 后检测变化 if (isFirst) { this.doCheck(); } } onChanges(): Subject > { return this.change$; }}// key-valueclass RenderKeyValueChange { private _differ: KeyValueDiffer ; private data: { [key: string]: T }; private change$: Subject > = new Subject(); constructor( // 数据 data: { [key: string]: T }, // 变化 private _differs: KeyValueDiffers ) { // 初始化时先执行一次changes this.doChanges(data, true); } private doCheck(): void { if (this._differ) { let changes = this._differ.diff(this.data); if (changes) { // 变化监听 this.change$.next(changes); } } } // 首次调用一次 之后每次变化调用 doChanges(data: any, isFirst: boolean = false): void { // 如果不是首次变化 先检测变化 if (!isFirst) { this.doCheck(); } this._differ = this._differs.find(data).create(); this.data = data; // 如果是首次变化 后检测变化 if (isFirst) { this.doCheck(); } } // 监听变化 onChanges(): Subject > { return this.change$; }}复制代码
- use
监听object变化
let a = { i: 2 };let b = { i: 2 };let c = { i: 2 };let d = { i: 2 };let list = { a: a, b: b, c: c, d: d };let change = new RenderKeyValueChange(list, this._differs);change.change$.subscribe(res => { console.log(res);});a.i = 333;list.a = c;change.onChanges(list);复制代码
监听数组变化
let a = { i: 2 };let b = { i: 2 };let c = { i: 2 };let d = { i: 2 };let list = [a, b, c, d];let change = new RenderIterableChange(list, this._iterableDiffers);change.onChanges().subscribe(res => { // 改变监听 console.log(res);});a.i = 333;list[1] = c;change.doChanges(list);复制代码
缺点,只能检测引用变化,不能检测真实值的改变 下面着手优化一下。