Получить массив объектов angular CLI

Привет, я пытаюсь получить данные из запроса на получение в angular. У меня есть квартира класса, которая выглядит так:

export class Apartment {

  id: number;
  address: string;

  constructor(id: number, name: string) {

      this.id = id;
      this.name = name;
 }
 }

Сервис

 @Injectable({
 providedIn: 'root'
 })
 export class Service {

 baseURL = 'http://localhost:3000';

 constructor(private httpClient: httpClient) {}

 getApartments() {
     return this.httpClient.get(this.baseURL + '/apartments');
 }
 }

Компонент

 export class SettingsComponent implements OnInit {

 apartments: Apartment[] = [];

 constructor(private apiService: Service) {
   // todo: fetch data here...
}}

У меня есть API для отдыха, который работает, и файл json для чтения, который выглядит так:

 {
   "id" : 0,
   "address: "not assinged yet"
 }

Как я могу прочитать и передать данные в массив апартаментов?

Тестирование функциональных 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
0
993
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В подписке вам нужно только объявить (data:any) вот так

constructor(private apiService: Service) {
    this.apiService.getApartments().subscribe((data:any)=>{
        this.apartments = data;
    });
}

Не используйте никакие. Это противоречит цели ТИПscript. Всегда вводите свои данные, даже если только для себя. Предполагая, что вы хотите облегчить себе жизнь с помощью отладки;)

AT82 28.04.2019 17:41

в этом случае он определил тип для квартир, если вы их не используете, он показывает ошибку, не может не использовать

Hien Nguyen 28.04.2019 17:48

Ну, тогда используйте определенный тип, а не any.

AT82 28.04.2019 17:49

Ваш API возвращает список квартир? Если да, вы можете подойти так:

export class SettingsComponent implements OnInit {

  apartments: Apartment[] = [];

  constructor(private apiService: Service) {}
}

ngOnInit(){
  this.fetchApartments();
}

fetchApartments(){
  this.apiService.getApartments().subscribe(
    response => {
      this.apartments = response;
    }
  );
}

Или,

constructor(private apiService: Service) {
  this.apiService.getApartments().subscribe(
    response => {
      this.apartments = response;
    }
  );
}
Ответ принят как подходящий

Если у вас нет каких-либо методов, специфичных для класса, я бы сам не использовал здесь класс, только интерфейс. Но если вы хотите иметь класс и создавать экземпляры своих данных для этого класса, вам нужно сопоставить свои данные, здесь, предположительно, вы получите массив. Также сообщите angular, что вы получаете в своем запросе:

 getApartments() {
   return this.httpClient.get<Apartment[]>(this.baseURL + '/apartments').pipe(
     map((arr) => arr.map(x => new Apartment(x.id, x.address)))
   )
 }

Затем в вашем компоненте:

ngOnInit() {
  this.apiService.getApartments()
    .subscribe((data: Apartment[]) => this.apartments = data);
}

Но, как я уже упоминал, я бы использовал интерфейс, если бы в классе не было методов:

export interface Apartment {
  id: number;
  address: string;
}

и запрос на получение, просто:

 getApartments() {
   return this.httpClient.get<Apartment[]>(this.baseURL + '/apartments')
 }

и подпишитесь в упомянутом выше компоненте.

если я использую интерфейс и относительный метод getApartments, мне все равно нужно подписаться или достаточно вызова getApartments?

GJCode 28.04.2019 17:44

С http-запросами мы имеем дело с холодными наблюдаемыми, вам всегда нужно подписаться, либо с помощью subscribe, либо с помощью async пайпа в шаблоне :)

AT82 28.04.2019 17:45

Если нет необходимости работать с данными, полученными в вашем TS-файле, очень удобно использовать асинхронный канал: angular.io/api/common/AsyncPipe Но если вам нужно как-то манипулировать данными в TS-файле, я бы предложил использовать subscribe.

AT82 28.04.2019 17:48

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