【发布时间】:2018-07-27 00:40:29
【问题描述】:
我正在我的 Angular (5) 应用程序中实现一个惰性图像加载器,我很好奇如何避免在我的 ngAfterViewInit() 中调用 setTimeout(),如果可能的话。
代码的相关部分是:
# component
ngOnInit(): void {
this.workService.getCategories().then(workCategories => {
this.workCategories = workCategories;
});
}
ngAfterViewInit(): void {
setTimeout(() => {
const images = Array.from(document.querySelectorAll('.lazy-image'));
}, 100);
}
# component template
<div *ngFor="let workCategory of workCategories">
<h3>{{ workCategory.fields.name }}</h3>
<div *ngFor="let workSample of workCategory.fields.workSamples">
<img width="294" height="294" class="lazy-image" src="..." data-src="..." />
</div>
</div>
如果我删除 setTimeout(),图像数组总是空的。 AfterViewInit 应该在所有子组件创建后运行。我也试过 AfterContentInit,它的行为和 AfterContentChecked 一样,它使 Chrome 崩溃。
这种情况下是否可以避免setTimeout?
【问题讨论】:
-
您是否有任何具体原因试图直接访问 DOM 节点?通常,在使用 angular 时,您希望尽可能少地直接访问 dom。例如,您是否尝试设置 onload 事件以在延迟加载中使用?
-
我正在使用 IntersectionObserver 的实现将原始 src 替换为包含实际图像 URL 的数据属性。
-
我们可以看看你在
ngOnInit中做了什么以及带有lazy-image元素的标记部分吗? -
我添加了 OnInit 和部分模板标记。简而言之,我检索工作类别,然后迭代每个类别的样本。
-
刚试了changeDetectorRef策略,图片数组还是空的。我可以坚持使用 setTimeout,我只是好奇是否有更好的方法。
标签: javascript angular