#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 в отличие от всех других условий для объекта, который вы используете в данный момент.