angular - Angular 6 模板没有看到变化
问题描述
Angular 6 组件通过 Input()allItems
参数接收一个大列表:
ngOnInit() {
this.isLoading = true;
}
ngOnChanges(changes) {
if (changes.allItems && changes.allItems.currentValue.length) {
this.isLoading = false;
}
}
我想在加载此列表时显示微调器。
<mat-spinner *ngIf="isLoading"></mat-spinner>
但是在某些情况下,微调器会永远旋转,停止它的唯一方法是使用 setTimeout。有没有更优雅的方法呢?请指教。
ngOnChanges(changes) {
if (changes.allItems && changes.allItems.currentValue.length) {
setTimeout(() => this.isLoading = false, 0);
}
}
我尝试了不同的方法:调用 ChangeDetectorRef 的 detectChanges、应用 onPush 策略等。
不幸的是,到目前为止唯一有效的是 setTimeout :(
解决方案
通过以下方法,您可以避免使用 ngOnChanges 挂钩:
@Input() set items(items: any[]) {
this.allItems = items;
if(this.allItems) {
this.isLoading = false;
}
}
如果你最初声明 isLoading 你甚至可以摆脱 ngOnInit 钩子:
isLoading = false;
推荐阅读
- javascript - CORS 响应标头如何防止浏览器 javascript 访问响应对象?
- java - Apache WSS4J 无法初始化
- javascript - 当所有项目添加到数组 -redux 时隐藏按钮
- wordpress - 创建一个将产品添加到购物车 Woocommerce 的表单
- python - Python中有没有办法对未知形状数组的最低有效索引进行计算?
- android - 如何自定义一个android库
- angular - Angular 路由器 - 获取当前导航过程的目标 URL
- c - 以下选择排序算法有什么问题
- r - 查找小标题的特定值的行和列名
- ios - 如何将 JSON 的值放入 TableView