angular - 使用 rxjs 在 Angular 中获取 FireStorage URL,直到渲染
问题描述
我尝试在 Angular App 中显示图像,但它有问题。没有图片显示。
html文件
<div id="canvas-my-bouquet">
<div id="container-my-bouquet">
<cdk-virtual-scroll-viewport appendOnly itemSize="50" class="my-bouquet-scroll">
<div *cdkVirtualFor="let boucket of arrayBouquetSrc"class="bouquet-item">
<div id="drag-items">
<span>{{boucket.name}}</span>
<img [src]="_DomSanitizationService.bypassSecurityTrustUrl(boucket)" class="flower-image" [matTooltip]="" matTooltipPosition="right">
</div>
</div>
</cdk-virtual-scroll-viewport>
</div>
</div>
打字稿文件
export class MyBouquetComponent implements OnInit {
email : any
Data : any
userInfo : any;
arrayBouquetName : string[]
arrayBouquetSrc : any[]
constructor( private fireStore : AngularFirestore, private loginServise : IsLoginService, private storage: AngularFireStorage, public _DomSanitizationService: DomSanitizer) {
this.arrayBouquetSrc = [];
}
async ngOnInit() {
this.email = await this.loginServise.userInfo();
this.Data = await this.fireStore.collection("user").doc(this.email).get().toPromise().then((data) => {
this.arrayBouquetName = data.get("src")
return this.arrayBouquetName
})
from(this.arrayBouquetName).pipe(
map(item => {
console.log(item) //this print 13, 14, flower1 on console
return firebase.storage().ref(`${this.email}`).child(`${item}`).getDownloadURL()
})
).subscribe((data : any) => {
data.then(data => {
this.arrayBouquetSrc.push(data)
console.log(this.arrayBouquetSrc) //this print url of firestorage image
})
})
console.log(this.arrayBouquetSrc) //this print [] on console
console.log("well....")
}
}
当我运行这段代码时,我从浏览器的控制台得到了这个结果。
渲染页面时,arrayBouquetSrc 为 [ ] 所以,在这种情况下可能无法显示图片
,在渲染之前如何获取 url?
解决方案
好的,我解决了这个问题。
首先,我参考这个链接
所以,我写了这段代码。
async ngOnInit() {
const items =[];
this.email = await this.loginServise.userInfo();
this.Data = await this.fireStore.collection("user").doc(this.email).get().toPromise().then((data) => {
this.arrayBouquetName = data.get("src")
return this.arrayBouquetName
})
const source$ = from(this.arrayBouquetName);
this.items$ = source$.pipe(
map(async item => {
let getValue = await firebase.storage().ref(`${this.email}`).child(`${item}`).getDownloadURL().then(async(data)=>{
//await console.log(data)
return data
})
console.log(getValue)
return {'name' : item, 'src' : getValue};
}),
map((data) => {
console.log(data)
items.push(data);
console.log(items)
return [...items]
}),
)
}
但它有问题。本例返回类型为 ZoneAwarePromise:(
所以,我尝试在打字稿文件中修复这个值,但是我无法解决它。
之后,我找到了另一种在模板文件中进行控制的方法,
效果很好:)
<div id="canvas-my-bouquet">
<div id="container-my-bouquet">
<cdk-virtual-scroll-viewport appendOnly itemSize="50" class="my-bouquet-scroll">
<div *cdkVirtualFor="let boucket of items$ | async"class="bouquet-item">
<div id="drag-items">
<span>{{boucket.__zone_symbol__value.name}}</span>
<img id={{boucket.__zone_symbol__value.name}} [src]="_DomSanitizationService.bypassSecurityTrustUrl(boucket.__zone_symbol__value.src)" class="flower-image" [matTooltip]="" matTooltipPosition="right">
</div>
</div>
</cdk-virtual-scroll-viewport>
</div>
</div>
推荐阅读
- node.js - 如何导入像“MyOwnLibrary/data”这样的模块
- python - 如何创建多个 1D 轴以彩色线条显示间隔?
- string - 在 Visual Studio 中更改字符串颜色不会更改引号颜色。那么我该如何改变呢?
- amazon-dynamodb - DynamoDB:从主键中获取所有排序键
- module - 在 Julia 的另一个模块中包含一个模块
- azure - 如何使用逻辑应用与大文件的 azure 函数从 blob 存储上传文件
- javascript - JavaScript如何对语言环境和英语进行排序
- java - Multicastsocket 在无限循环中不断接收相同的消息
- c - C中的字符串存储
- android - 无法理解 BasicActivity 项目显示其自动生成的布局的方式