angular项目(angular 7),ng-zorro(7.5.x)
使用carousel走马灯设置自动轮播图功能,从官网上copy下一段代码如下:
<nz-carousel nzAutoPlay>
<div nz-carousel-content *ngFor="let index of array">
<h3>{{ index }}</h3>
</div>
</nz-carousel>
其中array的定义是这样:
array = [1, 2, 3, 4];
这段代码可以很好的进行自动轮播。
但是我模仿了上面的代码后,页面上的图片却不自动轮播,而且在我点击下一个或者手动拖动图片滚动一下时,图片才开始自动轮播。
我的代码大概是下面这个意思:
array:any=[]; //全局数组
ngOnInit() {
this.getData(){}
}
//请求数据的方法
getData(){
let url=`xxxxx`
this.http.get(url).subscribe((res: any) => {
this.array=res.data
});
}
为什么会这样呢?
因为是异步加载的,carousel这个组件预先于数据进行加载,加载时数据还没有完全填充完毕,所以组件会认为只有一张图片,当我们手动点击这个组件时,组件重新读取了已经填充完毕的数据,所以才开始自动播放。
如何解决这个问题呢?其实也简单,就是当数据完全填充完毕时才开始渲染组件,为此,我们可以使用 ngIf(其他方法满足此思路都可以)
我把代码改成下面这样:
HTML:
<div *ngIf="showCarousel">
<nz-carousel nzAutoPlay>
<div nz-carousel-content *ngFor="let index of array">
<h3>{{ index }}</h3>
</div>
</nz-carousel>
</div>
TS:
array:any=[]; //全局数组
showCarousel=false; //是否展示轮播图
ngOnInit() {
this.getData(){}
}
//请求数据的方法
getData(){
this.showCarousel=false
let url=`xxxxx`
this.http.get(url).subscribe((res: any) => {
if(res.data.length>0){
this.array=res.data
this.showCarousel=true
}
});
}
因为ngIf是完全删除或加载dom节点,所以,有数据的时候才会填充carousel组件。