【问题标题】:Angular 9 Ngif giving wrong output because of delayed API response由于 API 响应延迟,Angular 9 Ngif 给出错误输出
【发布时间】:2020-11-01 00:51:13
【问题描述】:

如果这不是精心设计的,我深表歉意。我是新来的。所以我已经组装了我的第一个 SPA 并进行了部署,但是由于第三方 API 的响应延迟,使用 Ngif 会给出错误的输出。我正在使用“haveibeenpwned”API 来检索有关特定数据泄露的信息。问题是,如果确实存在违规,由于延迟,它仍然显示“未发现违规!”首先在实际显示适当的违规信息之前。我正在使用 Ngif 检查响应数组是否为空,显然由于延迟响应,它会显示没有发现违规,因为输出数组一开始是空的。

我可以在不使用视图模板的 Ngif 的情况下以另一种方式捕捉它吗?所以我的代码如下:

<div *ngIf="breachData.length > 0">
  <div *ngFor="let item of breachData; let i = index">
    <img src="{{item.LogoPath}}" alt="{{item.Name}}" class="small-logo mb-2">
    <p><strong>Breach Name:</strong> {{item.Name}}</p>
    <p><strong>Date of breach:</strong> {{item.BreachDate | date : "dd/MM/y"}}</p>
    <p><strong>Description:</strong></p>
    <p [innerHTML]="item.Description"></p>
  </div>
</div>

<div *ngIf="!breachData.length">
  <p>No breach found!</p>
</div>

我在生成它时使用的是 Angular 9,我丢失了部分代码,如果这看起来不太正确,我深表歉意,但基本上我使用了 ngIf 和 ngElse。是否可以在视图中输出之前捕获它?就像在 Breachcomponent.component.ts 中说的那样?因为我确实使用以下内容:

this.breachData.push(data);

这是破解组件的代码:

import { Component, OnInit } from '@angular/core';
import {HibpService} from "../hibp.service";
import {ActivatedRoute} from "@angular/router";

@Component({
  selector: 'app-breachcomponent',
  templateUrl: './breachcomponent.component.html',
  styleUrls: ['./breachcomponent.component.css']
})
export class BreachcomponentComponent implements OnInit {
  breach;
  public breachData = [];

  constructor(private hibpService: HibpService, private route: ActivatedRoute) { }

  ngOnInit(): void {
    this.route.paramMap.subscribe(params => {
      this.hibpService.showBreachInfo(params.get('breachName')).subscribe((data) => {
        this.breachData.push(data);
        console.log(this.breachData);
      });
    })
  }

}

抱歉,如果其中很多内容含糊不清。我对 Angular 很陌生,这是我的第一个应用程序。

任何帮助表示赞赏。请不要将此标记为不受欢迎,因为我是初学者。

【问题讨论】:

  • 你能发布你的组件类代码吗?
  • 我已经阅读了有关格式的所有内容,但由于某种原因,我无法正确理解,因此不确定代码是否有意义。每行末尾的两个空格不会导致换行,所以我的代码看起来很混乱。我听说过并阅读了一些关于使用解析器的信息,如果数组确实有长度,它将允许路由。有什么办法可以提供一个例子来说明我如何做到这一点?我读过的信息没有说明如何实际创建解析器或将它放在哪里。
  • 另外,它不会让我将我的代码放入评论中,因为它超过了此处任何一条评论所允许的字符长度。
  • 嗨,丹,您可以编辑您的帖子并在此处添加代码,而不是在评论中
  • @deerawan 嗨,我已经包含了 bypasscomponent.component.ts 代码,所以希望这会有所帮助。

标签: angular angular-ng-if


【解决方案1】:

您可以拥有另一个名为 loaded 的属性,并在加载数据后将其设置为 true

this.breachData.push(data);
this.loading = true;

你的 ngIf 看起来像

<div *ngIf="loading && breachData.length">

【讨论】:

  • 我见过类似的东西,但它是如何工作的?所以是的,我可以说如果`this.loading = true;`然后显示类似动画微调器的东西,但应用程序如何知道数据何时最终加载?这让我有点困惑。请进一步详细说明。
  • 对不起,我意识到它没有格式化我的代码this.loading = true;
  • 这里是我的 bypasscomponent.component.html 文件的完整代码:&lt;div *ngIf="breachData.length &gt; 0"&gt; &lt;div *ngFor="let item of breachData; let i = index"&gt; &lt;img src="{{item.LogoPath}}" alt="{{item.Name}}" class="small-logo mb-2"&gt; &lt;p&gt;&lt;strong&gt;Breach Name:&lt;/strong&gt; {{item.Name}}&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Date of breach:&lt;/strong&gt; {{item.BreachDate | date : "dd/MM/y"}}&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;&lt;/p&gt; &lt;p [innerHTML]="item.Description"&gt;&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;div *ngIf="!breachData.length"&gt; &lt;p&gt;No breach found!&lt;/p&gt; &lt;/div&gt;
  • 我不明白为什么它的格式不正确。我查看了文档,它说一行末尾有两个空格会导致换行,但这不起作用!对这个系统有点失望。
  • 请问有人对此有什么想法吗?我一直在尝试阅读各种方法,但到目前为止我真的不知道该走哪条路。
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2019-09-11
  • 2023-03-05
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多