博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手动触发ngOnChanges方案
阅读量:6219 次
发布时间:2019-06-21

本文共 2269 字,大约阅读时间需要 7 分钟。

// 数组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);复制代码

缺点,只能检测引用变化,不能检测真实值的改变 下面着手优化一下。

转载地址:http://gylja.baihongyu.com/

你可能感兴趣的文章
cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
查看>>
C语言课程设计—图书管理系统
查看>>
iOS 多线程
查看>>
【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)
查看>>
SQL删除重复数据方法
查看>>
C#资源文件与与资源名称字符串之间的互相转化
查看>>
[Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
查看>>
调试项目出错------360云盘同步搞的鬼
查看>>
sqlite建表语句(特别是外键问题)
查看>>
Android 刷新下拉控制 SwipeRefreshLayout
查看>>
Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件(转)
查看>>
持久化框架Hibernate 开发实例(一)
查看>>
CentOS下php安装mcrypt扩展
查看>>
2015.10.14-TransactionScope测试
查看>>
Android中MediaMuxer跟MediaCodec用例
查看>>
缓冲区的运用
查看>>
细谈WEB标准
查看>>
经典SQL
查看>>
Gitweb 安装与配置
查看>>
Microsoft.Net中数字签名技术
查看>>