Получить данные из API и перебрать в Angular2

Я новичок в Angular2 и пытаюсь выполнить простую задачу, но, похоже, это не работает.

Это мой файл TS

import { Component, OnInit } from '@angular/core';
import { ApiService } from './api.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
products;

constructor(private api: ApiService) {}  

ngOnInit() {
    this.getProducts();
}

getProducts() {
    this.products = this.api.get('http:/api/products').map((res:Response) => res.json());
    console.info(this.products);
}
}

Но когда я пытаюсь повторить итерацию в html файле вот так.

<h1>Products</h1>
    <div layout = "row">
<!-- List the products using the class "products" -->
    <div *ngFor = "#product of products ; #i = index" class = "products">{{ products.title }}</div>
    </div>

Вывод не отображается. Что сильного в моем коде?

Это сработало для вас?

SK. 08.05.2018 04:12
Тестирование функциональных 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
2
1
405
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы забыли подписаться на наблюдаемое.

Пожалуйста, замените this.products = this.api.get('http:/api/products').map((res:Response) => res.json());

к this.subscription = this.api.get('http:/api/products').map((res:Response) => res.json()).subscribe(data => this.products = data);

Также рассмотрите возможность замены #product of products ; #i = index на let product of products" в большинстве примеров, в руководствах используется let. Если вы не используете i из #i = index позже в коде, рассмотрите возможность его удаления, чтобы код был более простым.

Обновлено: Также добавьте новое свойство в компонент private subscription: Subscription и импортируйте Subscription из RxJS. Позже не забудьте отказаться от подписки на ngOnDestroy или после this.products = data;.

Предполагая, что private api: ApiService вызывает внутреннюю службу http Angular.

Или перейдите на шаблон let product of products | async и сохраните код машинописного текста в том виде, в котором он был изначально, без изменений. | async подпишется на наблюдаемые продукты и откажется от подписки автоматически. Также {{ product.title } - правильный синтаксис, а нет - products.

Я получаю эту ошибку Property 'subscription' does not exist on type 'AppComponent'.

Ali Rasheed 07.05.2018 21:32

пожалуйста, добавьте subscription, как я уже упоминал в ответе в строке products;

DrNio 07.05.2018 21:35

Я не могу добавить подписку. Я должен использовать все, что написал.

Ali Rasheed 07.05.2018 21:43

@AliRasheed: Вы сказали, что должны использовать то, что у вас есть. Мне интересно, как это работает, если вы не импортировали «Ответ» ... См. Мой ответ ниже

SK. 07.05.2018 22:27

Привет, @AliRasheed, я редактирую свой ответ. Я предполагаю, что это упражнение / тест, и вы не можете много редактировать. Пожалуйста, прочтите еще немного официальную документацию по angular, потому что есть примеры для таких простых вещей.

DrNio 07.05.2018 22:32

привет @AliRasheed, примите любой ответ, который сработал для вас, или оставьте отзыв.

DrNio 08.05.2018 14:59

Я бы поддержал любой ответ, но во всех них чего-то не хватает -> {{ products.title }}, это неправильно, и это должен быть {{ product.title }}. в любом случае :)

DrNio 08.05.2018 19:53

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

Ali Rasheed 08.05.2018 21:41

Проблема в вашем наблюдаемом.

ngOnInit() {
    this.getProducts();
}

getProducts() {
    this.products = this.api.get('http:/api/products').map((res:Response) => res.json());
    console.info(this.products);
}

необходимо изменить на:

ngOnInit() {
    this.getProducts().subscribe(data => this.products = data);
}

getProducts() {
    return this.api.get('http:/api/products').map((res:Response) => res.json());
}

Ваш код:

getProducts() {
    this.products = this.api.get('http:/api/products').map((res:Response) => res.json());
    console.info(this.products);
}

Измените его на: (Больше не нужно добавлять импорт)

getProducts() {
        this.api.get('http:/api/products').toPromise()
            .then(response => {
                let data = response.json();
                this.products = data;
        console.info(this.products);
       })
        .catch(error => {
       })
 }

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