ОШИБКА TypeError: this.locations[0].getCoordinates не является функцией

Когда я пытаюсь вызвать метод моего class (getCoordinates()), я получаю следующую ошибку:

ERROR TypeError: this.locations[0].getCoordinates is not a function

Где моя ошибка?

Мой метод обслуживания:

getLocations(){
    return this.http.get<Location[]>(this.locationUrl);
  }

Моя модель:

export class Location {
    id: number;
    objectTypeId: number;
    type: string;
    fields: Fields;
    fav: boolean;
    typeless: boolean;
    pages: number;
    lastmodified: string;

    public getCoordinates(): number {
        return this.id;
    }
}

export class Fields {
    city: string;
    street: string;
    company: string;
    plz: string;
    info: string;
}

Мой компонент:

public locations: Array<Location> = [];

ngOnInit() {
    this.getAddresses();
  }

getAddresses() {
    this.enaioService.getLocations()
      .subscribe(data => 
        this.locations = data,
        (error: HttpErrorResponse) => this.errorMessage = error.message
      );
  }

onClick() {
    console.info(this.locations[0].getCoordinates()); // Here the error occurs
  }
https://stackblitz.com/edit/angular-bjgtn4

Мой проект: https://bitbucket.org/sven_hagemann/myproject/src/master/
Клон: git clone https://[email protected]/sven_hagemann/myproject.git

Проверьте, каково значение this.locations[0]

David 03.07.2019 14:47

Не будет ли this.http.get<Location[]>(this.locationUrl); возвращать какие-то наблюдаемые данные, которые дадут данные JSON (которые вы приводите к типу Location). Или под всем этим происходит какая-то магия? Можете прислать дамп содержимого this.locations?

Phillip 03.07.2019 14:52

Пожалуйста, укажите данные, которые вы получаете в this.locations[0]. Будет полезно решить вашу проблему.

Sunny Parekh 03.07.2019 15:27

@Phillip: местоположения: Array<Location> = [];

SNMP 03.07.2019 20:25

@SunnyParekh -> this.locations[0]: {id: "47973", objectTypeId: "6", type: "FOLDER", fields: {…}, fav: false, …} fav: false fields: {city: "Henstedt-Ulzburg", улица: "Hamburger Straße 55", компания: "# 300 339 #", plz: "24558", информация: ""} id: "47973" lastmodified: "1538143201000" objectTypeId: "6" pages : 0 тип: "ПАПКА" без типа: false proto: Object

SNMP 03.07.2019 20:28

@David: значение this.locations[0] см. в сообщении ранее.

SNMP 03.07.2019 20:30

@SNMP хорошо. В этом объекте вы пытаетесь вызвать метод getCoordinates. И я не вижу этого в объекте нигде. Итак, вы можете объяснить, что вы хотите, вызвав этот метод? Это какое-то свойство, к которому вы пытаетесь получить доступ? Просьба уточнить.

Sunny Parekh 04.07.2019 07:35

Вот ссылка на stackbiz: stackblitz.com/edit/angular-bjgtn4

SNMP 04.07.2019 10:02
Тестирование функциональных 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
8
147
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это

getLocations(): Observable<Location[]>{
    return this.http.get<Location[]>(this.locationUrl)
  .pipe(map( (items: any[]) => 
   items.map(i => Object.assign(new Location(), i)); ));

}

Спасибо, Самир, но это еще не решает мою проблему.

SNMP 03.07.2019 15:15

какова ценность объекта this.locations[0]?

Sameer 03.07.2019 15:30

Привет Самир, вот значение: {id: "47973", objectTypeId: "6", type: "FOLDER", fields: {…}, fav: false, …} fav: false fields: {city: "Henstedt-Ulzburg ", улица: "Hamburger Straße 55", компания: "# 300 339 #", plz: "24558", информация: ""} id: "47973" lastmodified: "1538143201000" objectTypeId: "6" pages: 0 type: "ПАПКА" без типа: false прото: Объект

SNMP 03.07.2019 19:53

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

Sameer 03.07.2019 20:11

Я сделал это, но, к сожалению, результат тот же.

SNMP 03.07.2019 20:33

Затем вам нужно создать ссылку stackbiz. если хотите больше помощи

Sameer 03.07.2019 20:40
Ответ принят как подходящий

Это связано с тем, что список Location объектов, полученных из вашего getLocations метода, не является экземпляром класса Location. Теперь у вас есть просто синтаксический сахар машинописного текста, говорящий, что то, что возвращает getLocationsдолжен, имеет свойства класса Location, но это не обязательно.

Вам нужно изменить свой код следующим образом, чтобы вернуть реальные экземпляры класса Location

import {map} from "rxjs/operators";

getLocations(): Observable<Location[]>
{
    return this.http.get(this.locationUrl).pipe
    (map( (items: any[]) => items.map(i => Object.assign(new Location(), i));
    ));
 }

почему мне нужно перебирать все элементы. Должен быть какой-то более простой способ сделать это.

Sameer 04.07.2019 10:43

@ Самир, я не думаю, что есть другой способ. У вас есть список объектов, из которых вы хотите создать экземпляры класса Location, поэтому вам нужно сделать это для каждого элемента.

David 04.07.2019 11:02

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