当我使用 *NgFor 时,Flickity 停止工作
Flickity stops working the moment i use *NgFor
我正在尝试在我正在构建的 angular 应用程序中使用 Flickity。这是 link 我也知道 ngx-flickity 但我不想要它,因为它还没有准备好生产。
下面的代码有效
<div class="carousel">
<div class="carousel-cell">...</div>
<div class="carousel-cell">...</div>
<div class="carousel-cell">...</div>
...
</div>
当我使用 *NgFor 时,它停止工作没有任何错误
<div class="carousel">
<div class="carousel-cell" *ngFor="let product of products">
{{ product.name }}
</div>
</div>
我也试过prepend方法,但是没用。
看来您应该在获取数据并初始化模板后初始化 flickity。在你的 stackblits 中将 this.flick = ...
代码移动到 ngAfterViewInit()
钩子修复了问题
首先,您起诉 document.querySelector('.carousel')
如果您有多个轮播元素,它将 return 只有一个元素(第一个元素)对其他元素不起作用。
其次,您希望在数据 returned 和渲染后实例化 flick
。
一个快速的解决方法是使用这个:
ngOnInit(): void {
this.dataService.getProducts().subscribe(products => {
this.products = products;
setTimeout( () => {
document.querySelectorAll(".carousel").forEach(c => {
let flick = new flickity(c, { cellAlign: "left", contain: true});
})});
});
}
更新:
比使用 setTimeout
更好的解决方案是使用 ChangeDetecrotRef
在从服务器接收数据后立即强制显式更改检测(呈现)。
import { ChangeDetectorRef, Component, OnInit } from "@angular/core";
...
constructor(private dataService: DataService, private cdr: ChangeDetectorRef) {}
ngOnInit(): void {
this.dataService.getProducts().subscribe(products => {
this.products = products;
this.cdr.detectChanges();
document.querySelectorAll(".carousel").forEach(c => {
let flick = new flickity(c, { cellAlign: "left", contain: true});
});
});
}
我正在尝试在我正在构建的 angular 应用程序中使用 Flickity。这是 link 我也知道 ngx-flickity 但我不想要它,因为它还没有准备好生产。
下面的代码有效
<div class="carousel">
<div class="carousel-cell">...</div>
<div class="carousel-cell">...</div>
<div class="carousel-cell">...</div>
...
</div>
当我使用 *NgFor 时,它停止工作没有任何错误
<div class="carousel">
<div class="carousel-cell" *ngFor="let product of products">
{{ product.name }}
</div>
</div>
我也试过prepend方法,但是没用。
看来您应该在获取数据并初始化模板后初始化 flickity。在你的 stackblits 中将 this.flick = ...
代码移动到 ngAfterViewInit()
钩子修复了问题
首先,您起诉 document.querySelector('.carousel')
如果您有多个轮播元素,它将 return 只有一个元素(第一个元素)对其他元素不起作用。
其次,您希望在数据 returned 和渲染后实例化 flick
。
一个快速的解决方法是使用这个:
ngOnInit(): void {
this.dataService.getProducts().subscribe(products => {
this.products = products;
setTimeout( () => {
document.querySelectorAll(".carousel").forEach(c => {
let flick = new flickity(c, { cellAlign: "left", contain: true});
})});
});
}
更新:
比使用 setTimeout
更好的解决方案是使用 ChangeDetecrotRef
在从服务器接收数据后立即强制显式更改检测(呈现)。
import { ChangeDetectorRef, Component, OnInit } from "@angular/core";
...
constructor(private dataService: DataService, private cdr: ChangeDetectorRef) {}
ngOnInit(): void {
this.dataService.getProducts().subscribe(products => {
this.products = products;
this.cdr.detectChanges();
document.querySelectorAll(".carousel").forEach(c => {
let flick = new flickity(c, { cellAlign: "left", contain: true});
});
});
}