Angular 9 Ngif выдает неверный вывод из-за задержки ответа API

#angular #angular-ng-if

#angular #angular-ng-if

Вопрос:

Я прошу прощения, если это не очень хорошо обработано. Я здесь новичок. Итак, я собрал свой первый SPA и развернул, однако использование Ngif выдает неверный вывод из-за задержки ответа от стороннего API. Я использую API ‘haveibeenpwned’ для получения информации о конкретных нарушениях данных. Проблема в том, что из-за задержки, если нарушение действительно существует, сначала отображается сообщение «Нарушение не найдено!», прежде чем фактически отображать соответствующую информацию о нарушении. Я использую 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);
  

Вот код для breachcomponent:

 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, и это было мое первое приложение.

Любая помощь приветствуется. Пожалуйста, не отмечайте это как плохо воспринятое, поскольку я новичок.

Комментарии:

1. не могли бы вы опубликовать код своего класса компонента?

2. Я прочитал все о форматировании здесь, но по какой-то причине я не могу понять это правильно, поэтому не уверен, что код будет иметь смысл. Два пробела в конце каждой строки не вызывают разрыва строки, поэтому мой код выглядит запутанным. Я слышал и немного читал об использовании преобразователя, который разрешал бы маршрут, если массив имеет длину. Можете ли вы каким-либо образом привести пример того, как я мог бы это сделать, пожалуйста? В информации, которую я прочитал, не указано, как на самом деле создать распознаватель или куда его поместить.

3. Также это не позволит мне поместить мой код в комментарий из-за того, что он превышает длину символа, разрешенную в любом комментарии здесь.

4. Привет, Дэн, ты мог бы отредактировать свой пост и добавить код туда, а не в комментарий

5. @deerawan Привет, я включил код breachcomponent.component.ts, надеюсь, это поможет.

Ответ №1:

Вы могли бы вызвать другое свойство loaded и установить для него значение true после загрузки данных

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

Ваш ngIf будет выглядеть так

 <div *ngIf="loading amp;amp; breachData.length">
  

Комментарии:

1. Я видел что-то похожее на это, но как это будет работать? Так что да, я мог бы сказать, если ` this.loading = true;` затем отобразите что-то вроде анимированного счетчика, но как приложение узнает, когда данные наконец загрузятся? Это немного сбивает меня с толку. Пожалуйста, уточните подробнее.

2. Извините, я понял, что это не отформатировало мой код this.loading = true;

3. Вот полный код для моего breachcomponent.component.html файл: <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>

4. Я не понимаю, почему он неправильно форматируется. Я просмотрел документацию, и в ней говорится, что два пробела в конце строки вызывают разрыв строки, но это не работает! Немного разочарован этой системой.

5. У кого-нибудь есть какие-либо идеи по этому поводу, пожалуйста? Я пытался ознакомиться с различными методами, но на данный момент я действительно не знаю, в какую сторону идти.