angular - ngOnchanges 和 DoCheck 角度
问题描述
在研究 Angular 中 ngOnChanges 和 DoCheck 之间的区别时,我看到了一些我无法解释的东西,需要你的帮助。
基本上,我知道 ngOnChanges 无法识别数组或对象的变化,而 DoCheck 可以。我在这里创建了 stackblitz:https ://stackblitz.com/edit/angular-ivy-sbyzya?file=src/app/app.component.html
在 app.component.html 中
- 如果您注释第 2 行,那么只有 ngOnChanges 运行的组件,单击添加或编辑时数据没有排序。没错,因为 OnChange 无法检测到数组@Input 的变化。
<data-table-onchange [data]="numbers"></data-table-onchange>
<!-- <data-table-docheck [data]="numbers"></data-table-docheck> -->
- 如果您注释第 1 行,那么只有 DoCheck 运行的组件,单击添加或编辑时数据排序。没错,因为DoCheck可以检测到数组@Input的变化。
<!--<data-table-onchange [data]="numbers"></data-table-onchange> -->
<data-table-docheck [data]="numbers"></data-table-docheck>
- 但是如果你让两个子组件都运行,当点击添加或编辑时,两个子组件中的数据都会被排序。这对我来说似乎很奇怪,因为我不明白为什么 DataTableOnchangeComponent 可以运行排序功能。我在 ngOnChanges 中进行了排序,单击添加或编辑时未触发 ngOnChanges,但不知何故数据仍然得到排序。
<data-table-onchange [data]="numbers"></data-table-onchange>
<data-table-docheck [data]="numbers"></data-table-docheck>
解决方案
当您取消注释这两行时,两个表都对数字进行排序的原因是,当 DoCheck 启动排序时, 数字数组实际上正在排序,并且它是两个组件中显示的相同数组。Javascript 的 Pass By Reference 正在发挥作用。
要查看差异,请尝试为这两个组件设置 2 个不同的数组,您应该会看到 OnChanges 组件中的数组没有排序。
<data-table-onchange [data]="numbers"></data-table-onchange>
<data-table-docheck [data]="numbers2"></data-table-docheck>
在 TS
public numbers: number[] = [5, 69, 9];
public numbers2: number[] = [5, 69, 9];
public add(): void {
const random: number = Math.floor(Math.random() * 100);
this.numbers.push(random);
this.numbers2.push(random);
}
推荐阅读
- java - 当靠近目标 Vector2 时,Actor 会抖动
- python - 如何从 Eclipse pydev 中在 pydevd.py 上设置主机
- google-cloud-storage - 如何通过 API 发布到 Google Cloud Storage 存储桶
- kotlin - 可空布尔值的 Kotlin 箭头
- swift - 如何将 SwipeCellKit 的自定义滑动功能用于从 .xib 文件创建的自定义单元格?
- javascript - 如何从存储值响应式更新组件中的值?
- javascript - mySQL LOAD DATA LOCAL INFILE 逗号分隔
- r - R Flexdashboard中的下载按钮宽度
- azure - 是否可以通过 Java sdk 在边缘设备模块上安排 DeviceJob Twin 更新?
- mysql - 在 MariaDB/MySQL 中以多级 JSON 查询特定值