Как показать таблицу, если в ней есть данные из api, иначе показать другой div

#angular #typescript

#angular #typescript

Вопрос:

В моем приложении Angular 6. У меня есть таблица, показывающая данные из веб-api, также у меня есть несколько ngIf контейнеров. Отображается сообщение, если данные веб-api пусты. Другой должен показывать таблицу, если в нее возвращаются данные. Мой текущий код не работает:

.ts файл

   public errorApi = false;
  public tableShow = false;

ngOnInit() {
    this.service.getIncidents(this.customer_id).subscribe((data) => {
      this.loading = true;
      this.data = data.result;
      this.loading = false;
      console.log('Result - ', data);
      console.log('data is received');

      this.errorApi = data.result == null || data.result === 0 || data.result.length === 0;
      this.tableShow = this.data amp;amp; this.data.result;
      }) 
    }
}
  

HTML

 <ng-container *ngIf="errorApi">
        <div class="column col-12 text-center pt-10 pb-10">
        <div class="empty">
            <div class="empty-icon">
              <i class="icon icon-people"></i>
            </div>
            <p class="empty-title h5">There are no incidents to display</p>
            <div class="empty-action">
              <button class="btn btn-primary">Create an incident</button>
            </div>
          </div>
          </div>
      </ng-container>

<ng-container *ngIf="tableshow">
       <table></table>
      </ng-container>
  

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

1. Когда вы делаете, this.data = data.result почему вы проверяете this.data amp;amp; this.data.result ?

2. Если есть данные или равно нулю

3. Я думаю, вы должны проверять только this.tableShow = this.data то, что this.data уже есть data.result ? Или ты имел в виду this.data.length ?

Ответ №1:

Попробуйте else в инструкции ngIf

 <ng-container *ngIf="errorApi else apiTable">
        <div class="column col-12 text-center pt-10 pb-10">
        <div class="empty">
            <div class="empty-icon">
              <i class="icon icon-people"></i>
            </div>
            <p class="empty-title h5">There are no incidents to display</p>
            <div class="empty-action">
              <button class="btn btn-primary">Create an incident</button>
            </div>
          </div>
          </div>
      </ng-container>

<ng-container #apiTable>
       <table></table>
      </ng-container>
  

Ответ №2:

Используйте переменную data напрямую, чтобы проверить, есть ли в ней данные или нет.

Это проверяет, есть ли у вас данные в data массиве. Если есть, то отобразится таблица, но если это пустой массив или null, то отобразится ошибка.

Определите свою переменную данных в ts первом: data = [];

 <div *ngIf="!data.length > 0">
    <div class="column col-12 text-center pt-10 pb-10">
        <div class="empty">
            <div class="empty-icon">
                <i class="icon icon-people"></i>
            </div>
            <p class="empty-title h5">There are no incidents to display</p>
            <div class="empty-action">
              <button class="btn btn-primary">Create an incident</button>
            </div>
       </div>
  </div>
</div>

<div *ngIf="data.length > 0">
   <p>Table Data here</p>
</div>
  

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

1. @MaihanNijat чтобы избежать undefined, вы должны инициализировать data при объявлении data = [] в ts-файле. Прямо сейчас шаблон angular не знает, будут ли данные {} или []

2. Мои данные определены в файле .ts как public data: any;

3. Все еще получаю эту ошибку: ошибка не удается прочитать свойство ‘length’ из undefined?

4. Хорошо, ошибки исчезли, но сообщение об ошибке появляется, даже если есть данные?

5. @MaihanNijat На какое условие вы ссылались?

Ответ №3:

Попробуйте else из *ngIf директивы:

 *ngIf="errorApi; else apiTable"
  

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

1. В исходном вопросе нет «подходящего»

Ответ №4:

 public data: any;
public loading: boolean;

private subscription: Subscription;

ngOnInit() {
   this.loading = true;
   this.subscription = this.service.getIncidents(this.customer_id)
   .subscribe((data: any) => {
      this.loading = false;

      // Because you have no error logic in your service
      If (data.result //amp;amp; any other validation on the data: {}) {
          this.data = data.result;

          console.log('Result - ', data);
          console.log('data is received');
      } else {
        this.errorApi = true;
      } 
    });
}

ngOnDestroy(): void {
   this.subscription.unsubscribe();
}
  

И в вашем html вы можете использовать ng-template :

 <ng-template *ngIf="data amp;amp; !loading; else errorTemplate">...</ng-template>
<ng-template #errorTemplate>...</ng-template>
  

Очевидно, что это необходимо для вашей проверки данных: {} но это должно дать вам некоторые идеи.

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

1. В идеале вы должны реализовать свой сервис, чтобы возвращать данные как действительные и использовать (ошибка: any) => {} для учета ошибок, с которыми вы можете столкнуться. Таким образом, вам не нужно дважды проверять наличие данных {}, и вы можете просто использовать это. данные в качестве проверки в вашем DOM в отличие от всех других условий для объекта, который вы используете в данный момент.