Angular 如何在等待请求的所有Firebase数据全部完成时显示加载状态?

Angular 如何在等待请求的所有Firebase数据全部完成时显示加载状态?,angular,typescript,ionic2,loading,Angular,Typescript,Ionic2,Loading,星期五快乐!我只想得到关于如何显示加载的任何建议,如下所示: 等待Firebase数据完全加载时 我试着用 <div *ngIf="!listOfFoodObject"> <img [src]="https://i.stack.imgur.com/7luvR.gif" /> </div> 和我的视图: <ion-list> <ion-item *ngFor="let food of listOfFoodObject">

星期五快乐!我只想得到关于如何显示加载的任何建议,如下所示:

等待Firebase数据完全加载时

我试着用

<div *ngIf="!listOfFoodObject">
   <img [src]="https://i.stack.imgur.com/7luvR.gif" />
</div>

和我的
视图:

<ion-list>
    <ion-item *ngFor="let food of listOfFoodObject">
        <ion-thumbnail item-left (click)="show_item_details(food.menu_name,food.key,food.menu_image,food.description)">
            <img src="{{food.menu_image}}">
        </ion-thumbnail>
        <h2 (click)="show_item_details(food.menu_name,food.key,food.menu_image,food.description)">{{food.menu_name}}</h2>
        <p (click)="show_item_details(food.menu_name,food.key,food.menu_image,food.description)">{{food.description}}</p>
        <p>
            <ion-icon ios="ios-star" md="md-star"></ion-icon>
            3.8
        </p>
        <button ion-button round item-right (click)="show_item_details(food.menu_name,food.key,food.menu_image,food.description)">View sellers</button>
    </ion-item>
</ion-list>

{{food.menu{u name}}
{{food.description}

3.8

查看卖家
谢谢

var firebasePromise = new Promise(function(resolve, reject) {

    // Do your database tasks, request data

    if(data was returned) {
        resolve(here you return your data);
    }
    else {
        reject(here you throw an error);
    }
});

firebasePromise.then(function() { 
    // this part deals with the resolved promise
    // so you can use your data here
}).catch(function() {
    // in here you handle your error that was returned by reject
})
上面这一个是promise的基本示例,它是一个规范,用于标准化AJAX请求,如果您使用nodejs、angularjs或其他库,可能有内置的promise可以使用,如果没有,您可以查找延迟对象,这几乎是promise实现

您做出承诺(firebasePromise),承诺可以被解析(您的数据以异步方式成功返回)也可以被拒绝。firebasePromise在后台启动并工作,完成后将激发then方法,并使您能够对已解析或已拒绝的返回值执行操作。这是一个过度就业,但你可以得到它的要点

上面这一个是promise的基本示例,它是一个规范,用于标准化AJAX请求,如果您使用nodejs、angularjs或其他库,可能有内置的promise可以使用,如果没有,您可以查找延迟对象,这几乎是promise实现


您做出承诺(firebasePromise),承诺可以被解析(您的数据以异步方式成功返回)也可以被拒绝。firebasePromise在后台启动并工作,完成后将激发then方法,并使您能够对已解析或已拒绝的返回值执行操作。这是一个过度配置,但您可以了解其要点。

根据您的Firebase代码,您可能已将listOfFoodObject初始化为空数组

listOfFoodObject =[];
但空数组是“truthy”值,这就是为什么在下面的HTML代码中*ngIf条件为false,图像未显示:

<div *ngIf="!listOfFoodObject">
   <img [src]="https://i.stack.imgur.com/7luvR.gif" />
</div>


您应该在
forEach
循环之前将
listofoodobject
初始化为空数组。

根据Firebase代码,您可能已将listofoodobject初始化为空数组

listOfFoodObject =[];
但空数组是“truthy”值,这就是为什么在下面的HTML代码中*ngIf条件为false,图像未显示:

<div *ngIf="!listOfFoodObject">
   <img [src]="https://i.stack.imgur.com/7luvR.gif" />
</div>


您应该在
forEach
循环之前将
listofoodobject
初始化为空数组。

如上所述

使用mnemosdev发布的代码,你会没事的

但是这里有一个关于你在做什么的问题,你是否在显示加载的gif时隐藏了页面的其余内容?因为用户可以单击页面中的任何内容,甚至可以返回而没有响应,所以这是一个糟糕的用户体验

创建一个自定义组件,这样当您要请求某个内容时,您可以调用一个表示loding的方法(不带*ngIf内容),当您结束它时,无论是否有数据,您都可以调用隐藏加载的方法


这不是对你的问题的有效回答,只是认为你应该知道。

如上所述,使用承诺

使用mnemosdev发布的代码,你会没事的

但是这里有一个关于你在做什么的问题,你是否在显示加载的gif时隐藏了页面的其余内容?因为用户可以单击页面中的任何内容,甚至可以返回而没有响应,所以这是一个糟糕的用户体验

创建一个自定义组件,这样当您要请求某个内容时,您可以调用一个表示loding的方法(不带*ngIf内容),当您结束它时,无论是否有数据,您都可以调用隐藏加载的方法


这不是对您的问题的有效回答,但只是认为您应该知道。

您是否尝试过使用承诺并等待解决,而在未解决时使用“等待”图像?实际上,任何ajax方法都可以;将“waiting icon”放在活动html元素中,并在ajax调用导致成功时将属性display设置为none承诺并等待我不知道如何使用它(^ ^)。你能给我看一个示例代码吗?那么,它解决了你的问题吗?:)您是否尝试过使用承诺并等待解决,而在未解决时使用“等待”图像?实际上,任何ajax方法都可以;将“waiting icon”放在活动html元素中,并在ajax调用导致成功时将属性display设置为none承诺并等待我不知道如何使用它(^ ^)。你能给我看一个示例代码吗?那么,它解决了你的问题吗?:)好的,谢谢,让我先试试。稍后我会给出反馈。好的,谢谢,让我先试试。稍后我会给出反馈。