angular - 如何在角度 ngfor 中显示来自 Firebase 存储的文件
问题描述
如何在给定模板中的文件路径的情况下显示 Firebase 存储文件。假设我有一个数组中的文件路径。是否可以做这样的事情:组件类函数
downloadFile(file){ return this.storage.ref(file).downloadURL()}
然后在模板中的 ngFor ...
<div *ngFor="let file in files"> <img src="downloadFile(file)"> </div>
我试过这个,但我的页面冻结了......
解决方案
该downloadURL
函数返回一个 Observable。因此,您将无法这样做。
但是您可以创建两个数组。这些 observables 之一,另一个用于实际下载 url。然后,您可以forkJoin
在 downloadURLObservables 数组上应用运算符来获取实际的下载 url。
这就是它在代码中的样子:
// import forkJoin from here.
import { forkJoin } from 'rxjs/observable/forkJoin';
// declare arrays for storing observables and download url strings;
downloadUrlObservables: Observable<string>[];
downloadUrls: string[];
// map the files to get the download urls in the observable array.
downloadUrlObservables = this.files.map(file => this.storage.ref(file).downloadURL());
// apply a forkJoin to get all the download urls at once.
forkJoin(this.downloadUrlObservables).subscribe(downloadUrls => this.downloadUrls = downloadUrls);
然后您可以在模板中使用 downloadUrls 数组,如下所示:
<div *ngFor="let downloadUrl in downloadUrls"> <img [src]="downloadUrl | safe: 'url'"> </div>
如果遇到 DOM 清理错误,您可能必须清理图像标签的 src url。
为了解决这个问题,你可以创建一个 Angular Pipe 来做这件事。
这是该管道的通用实现,由这篇中型文章提供:
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';
@Pipe({
name: 'safe'
})
export class SafePipe implements PipeTransform {
constructor(protected sanitizer: DomSanitizer) { }
public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
switch (type) {
case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);
case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);
case 'script': return this.sanitizer.bypassSecurityTrustScript(value);
case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);
case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);
default: throw new Error(`Invalid safe type specified: ${type}`);
}
}
}
推荐阅读
- react-native - 如何将 ColorFilter 与 React-Native-Lottie 一起使用?
- python - 选择每个列表中的第一项
- javascript - React 优化功能组件
- calendar - 日期选择器:无法使用 ngbDatepicker 滚动所有年份
- c++ - WORD 大小和 C/C++ 变量 - 较小的 Int 大小实际上使用较少的内存吗?
- java - Android RecyclerView 项目动态布局
- java - 如何通过apache poi在word中设置表格行的高度不同的每一列
- xml - XSL-FO 在表格单元格内包装长文本
- c - 错误 C2088:“+=”:在 Visual Studio 上使用 c 的联合是非法的
- reactjs - 使用 useHistory、useLocation 挂钩的挂钩调用无效