您能否修改您的 JSON 以具有 loaded 布尔属性?如果可以,这将很容易,请这样做:
<ion-card *ngFor="let item of items">
<img [src]="item.picture" (load)="item.loaded = true" [hidden]="!item.loaded" />
<img src="../path/to/your/placeholer/image.jpg" [hidden]="item.loaded">
</ion-card>
您将拥有一个始终初始化为 false 的加载属性,当图像加载时,(load) 事件将被触发并将图像加载属性更改为 true,隐藏占位符图像并显示加载的图像。
如果您无法更改此 JSON(或者如果它太大而无法编辑),您可以使用上面的代码,但在您的页面中执行以下操作.ts
public functionWhoseIsLoadingYourJson(){
// HTTP REQUEST FOR JSON
.subscribe(response => {
response.forEach(element => {
element.loaded = false;
});
this.items = response;
});
}
只需迭代您的响应,并在每个对象中将加载的属性设置为 false。如果这会引发一些错误,您可以将您的 <ion-card> 放在带有 *ngIf 的 div 中
<div *ngIf="this.items != null">
<!-- ion card -->
</div>
编辑 - 更新 JSON
由于它来自 Firebase,因此可以通过三个选项来更新您的 JSON。第一个是一个函数,您只需执行一次即可更新数据库,第二个仍然是我提供的代码(遍历结果并推送布尔值),但由于您使用的是 Firebase,所以它会有所不同。
第一个解决方案:
在你的代码中的某个地方,它可以是任何页面,你只需要执行一次:
firebase.database().ref('myDataNode').on('value', snapshot => {
for(let key in snapshot.val()){
firebase.database().ref('myDataNode/' + key + '/loaded').set(false);
}
});
看到我正在遍历您的myDataNode 中的所有结果,并使用它们的密钥将loaded 属性设置为false。但是在使用set 时要小心,因为您可以覆盖所有节点,在执行此方法之前请记住导出您的 Firebase 节点以进行备份。如果您要从代码中的任何位置将图像推送到 Firebase,请记住将其更改为一起设置 loaded 属性。
如前所述,第二个是我在此答案中所做的,但现在在您的 Firebase 调用中使用它并使用快照随附的 forEach 方法:
firebase.database().ref('myDataNode').on('value', snapshot => {
snapshot.forEach(element =>{
this.myDataNode.push({
picture: element.val(), // maybe it needs to be element.val().nameOfYourProperty
loaded: false
})
});
});
这将使用图片 url 和加载的属性将一个新元素推送到您的数组。如果它无法识别.push() 方法,只需将变量类型声明为数组即可:
public myDataNode: any[];
第三个只是在本地更新,遍历您的 firebase 快照,将结果保存在本地变量中,创建一个新属性并将其推送到您的数组:
firebase.database().ref('myDataNode').on('value', snapshot => {
for (let key in snapshot.val()){
snapshot.forEach(item => { // iterate snapshot
let record = item.val(); // save the snapshot item value in a local variable
record.loaded = true; // add the property
this.newArray.push(record); // push it to your array that'll be used in ng-for
return true; // return true to foreach
});
}
});
希望这会有所帮助。