Невозможно прочитать данные из службы в таблице HTML

Я использую службу для получения данных в формате JSON для моей таблицы в проекте Angular 7. Это определение услуги.

 getLandingDashboardSnapshotDetails() {
    return this.http.get<Snapshot[]>('<removed>');
  }

Это модель моментального снимка, используемая в сервисе.

export interface Snapshot {
   RequestsPendingApproval: string,
   TotalApprovedRequests: string,
   TotalDrafts: string,
   TotalRejectedRequests: string 
}

В моем файле .ts это то, что я определил.

LandingDashboardSnapshotData: Snapshot[];

ngOnInit() {
    this.messageService.getLandingDashboardSnapshotDetails().subscribe(
      response => {
        this.LandingDashboardSnapshotData = response;
        console.info(this.LandingDashboardSnapshotData)
      },
      errorResponse => { console.info(errorResponse) }
    );

Вот как я пытаюсь отобразить данные в своей таблице.

<div class = "container">
    <table class='reports'>
        <tr *ngFor = "let d of LandingDashboardSnapshotData">
            <th class = "reports-data">Pending for Approval : {{ d.RequestsPendingApproval }} </th>
            <th class = "reports-data">Total Sent : 11</th>
            <th class = "reports-data">Total Drafts : 4</th>
            <th class = "reports-data"> Total Rejected : 4</th>
        </tr>
    </table>
</div>

Я могу видеть данные из службы с помощью console.info (). Однако, когда я пытаюсь запустить это, я получаю сообщение об ошибке: «Не удается найти другой поддерживающий объект» [object Object] »типа« object ». NgFor поддерживает привязку только к Iterables, таким как Arrays. Я не понимаю, почему я получаю сообщение об ошибке. Как еще я могу отобразить данные?

когда вы делаете "console.info (this.LandingDashboardSnapshotData)" ... вы получаете массив объектов (с несколькими значениями, верно?)?

Akber Iqbal 18.12.2018 09:11

Да, я понимаю все ценности. Это выглядит так: {Запросы, ожидающие утверждения: 30, Всего черновиков: 34, Всего отклоненных запросов: 36, Всего одобренных запросов: 34}

Akshat Sood 18.12.2018 09:12

поскольку у вас есть «{Запросы, ожидающие утверждения: 30, Всего черновиков: 34, Всего отклоненных запросов: 36, Всего одобренных запросов: 34}», это означает, что вы получили только объект ... не массив ... не можете использовать * ngFor; ... попробуйте ... {{LandingDashboardSnapshotData.RequestsPendingApproval}} {{LandingDashboardSnapshotData.TotalDrafts}} {{LandingDashboardSnapshotData.TotalRejectedRequests}} {{LandingDashboardSnapshotData.Totals }Approved результаты будут

Akber Iqbal 18.12.2018 09:15

Я пробовал. Я получил сообщение об ошибке: Не могу прочитать свойство RequestsPendingApproval из undefined

Akshat Sood 18.12.2018 09:18

если полученные вами данные представляют собой объект, содержащий несколько массивов ... вы можете попробовать <tr * ngFor = "let d of LandingDashboardSnapshotData.RequestsPendingApproval">

Akber Iqbal 18.12.2018 09:18

Нет, он содержит только одно значение для каждого. Думаю, поэтому * ngFor не работает. Как я могу получить доступ к значению объекта?

Akshat Sood 18.12.2018 09:27

Вы получаете ответ в виде массива или просто объекта?

Rahul 18.12.2018 12:22
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
7
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Кажется, что ваш this.http.get возвращает что-то другое, кроме массива.

Объявления машинописного текста предназначены только для разработки, и типы становятся недоступными, когда они переносятся в JavaScript.

Следовательно, ваш this.http.get возвращает [Object Object], но вы пытаетесь выполнить итерацию с помощью NgFor, который принимает только массивы.

Да, я только что проверил. Он возвращает объект этого формата {Запросы, ожидающие утверждения: 30, Всего черновиков: 34, Всего отклоненных запросов: 36, Всего одобренных запросов: 34. Как мне извлечь из этого значения? Я уже пробовал использовать {{LandingDashboardSnapshotData.RequestsPendingApproval}} и т. д., Но при этом я получаю сообщение об ошибке: «Не могу прочитать свойство RequestsPendingApproval» неопределенного значения.

Akshat Sood 18.12.2018 09:21

ваши данные json содержат необычные пробелы. Requests Pending Approval: 30. поболтайте с вашим backend разработчиком :)

Derviş Kayımbaşıoğlu 18.12.2018 09:24

О нет, это просто вывод console.info (). Фактический JSON выглядит так: {«Запросы, ожидающие утверждения»: 30, «Всего черновиков»: 34, «Всего отклоненных запросов»: 36, «Всего одобренных запросов»: 34}

Akshat Sood 18.12.2018 09:25

разве вы не видите, что на {"Requests Pending Approval":30 есть пробелы?

Derviş Kayımbaşıoğlu 18.12.2018 09:27

Я изменил это с бэкэнда. Теперь это: {"TotalRejectedRequests": 36, "TotalDrafts": 34, "TotalApprovedR equests": 34, "Request‌ sPendingApproval": 30‌} Я все еще получаю сообщение об ошибке "Невозможно прочитать свойство RequestsPendingApproval" неопределенного

Akshat Sood 18.12.2018 09:39

внесите в свой вопрос текущие правки, чтобы мы могли понять, что происходит.

Derviş Kayımbaşıoğlu 18.12.2018 09:41

@ user2978664 также добавьте свой новый json в свой вопрос.

Farhat Zaman 18.12.2018 10:00

вслед за вашим комментарием «Нет, он содержит только одно значение для каждого. Вот почему * ngFor не работает ...» попробуйте это ...

<div class = "container">
    <p class='reports' *ngIf = "LandingDashboardSnapshotData">
        {{ LandingDashboardSnapshotData.RequestsPendingApproval }} <br/>
        {{ LandingDashboardSnapshotData.TotalRejectedRequests }} <br/>
        etc...
    </p>
</div>
Ответ принят как подходящий

в вашем служебном файле

getLandingDashboardSnapshotDetails() {
    return this.http.get<Snapshot>('<removed>');
  }

а затем в вашем файле компонента замените LandingDashboardSnapshotData: Snapshot[]; на LandingDashboardSnapshotData: Array<Snapshot>;, а затем в конструкторе определите его как пустой массив, и после получения ответа от службы попробуйте вставить его в свой массив, потому что вы получаете объект, поэтому не нужно его назначать, просто нажмите его в массиве.

export class AppComponent  {
  LandingDashboardSnapshotData: Array<Snapshot>;

constructor(private http: HttpClient) {
  this.LandingDashboardSnapshotData = [];
}

ngOnInit() {
    this.getLandingDashboardSnapshotDetails().subscribe(
      (response) => {
        this.LandingDashboardSnapshotData = response;
        console.info(this.LandingDashboardSnapshotData)
      }
    );
}
}

вот рабочий пример ссылка на сайт.

Это сработало для меня, но вместо this.LandingDashboardSnapshotData.push (response); Я использовал this.LandingDashboardSnapshotData = response; Изменение типа данных переменной LandingSnapshotData сработало. Спасибо за ваш ответ!

Akshat Sood 18.12.2018 14:31

а также предложить отредактировать мой ответ, чтобы он также помог другим.

Farhat Zaman 18.12.2018 15:44

Другие вопросы по теме