Ionic 3 angular 5 запрос рестапи не работает

Я пытаюсь получить данные из API, но не могу распечатать значения в приложении. неправильно читает json. не уверен, что я сделал не так .. любая помощь будет полезна. Мне нужно иметь возможность анализировать в json, чтобы получить strat_name

это мой код

home.ts:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { RestApiProvider } from '../../providers/restapi/restapi';

@Component({
    selector: 'page-home',
    templateUrl: 'home.html'
})
export class HomePage {

    names: string[];
    errorMessage: string;
    descending: boolean = false;
    order: number;
    column: string = 'name';

    constructor(public navCtrl: NavController, public rest: RestApiProvider) { }

    ionViewDidLoad() {
        this.getNames();
    }

    getNames() {
        this.rest.getNames()
            .subscribe(
                names => this.names = names,
                error =>  this.errorMessage = <any>error
            );
    }


    sort() {
        this.descending = !this.descending;
        this.order = this.descending ? 1 : -1;
    }
}

home.html

<ion-header>
  <ion-navbar>
    <ion-title>
      Name List
    </ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <ion-searchbar [(ngModel)] = "terms"></ion-searchbar>
  <button ion-button type = "button" (click) = "sort()">Sort</button>
    <h1>{{names | json}}</h1>
  <ion-item *ngFor = "let c of names | search : terms | sort: {property: column, order: order}">
    <h2>{{c.strat_name}}</h2>
  </ion-item>
</ion-content>

restapi:

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { map, catchError } from 'rxjs/operators';

@Injectable()
export class RestApiProvider {

    private apiUrl = 'https://macrostrat.org/api/v2/defs/strat_names?all';

    constructor(public http: HttpClient) {
        console.info(this.apiUrl);
    }

    getNames(): Observable<string[]> {
        return this.http.get(this.apiUrl).pipe(
            map(this.extractData),
            catchError(this.handleError)
        );
    }

    private extractData(res: Response) {
        let body = res;
        return body || {};
    }

    private handleError (error: Response | any) {
        let errMsg: string;
        if (error instanceof Response) {
            const err = error || '';
            errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
        } else {
            errMsg = error.message ? error.message : error.toString();
        }
        console.error(errMsg);
        return Observable.throw(errMsg);
    }

}

не уверен, что я сделал не так .. любая помощь будет полезна. Мне нужно иметь возможность анализировать json, чтобы получить strat_names.

сначала он загружает json

как только я нажимаю на поиск

Привет! у вас есть ошибка? не могли бы вы зарегистрировать ответ сервера и содержимое имен после ответа api в home.ts?

Nicolás Longhi 17.12.2018 20:55

не могли бы вы добавить это в свой html (сразу после кнопки сортировки) и поделиться результатом {{names | json}}

Reza 17.12.2018 21:34

это правильно? <button ion-button type = "button" (click) = "sort ()"> Сортировать </button> {{имена | json}} поэтому я получаю items.filer не функция @RezaRahmati

Lbook 18.12.2018 15:26

json pipe просто отображает ваш объект как json в вашем html, поэтому это не вызовет этой проблемы, но также это означает, что в вашем коде есть проблема, поэтому для ее отслеживания удалите | search : terms | sort: {property: column, order: order} из вашего ion-item

Reza 18.12.2018 15:58

@RezaRahmati, теперь я получаю сообщение об ошибке при попытке сравнить "{Object Object}". разрешены только массивы и итерации

Lbook 18.12.2018 16:09

Хорошо, сделайте это, перейдите на stackblitz.com и создайте там проект, попробуйте воспроизвести проблему и поделитесь ссылкой здесь, чтобы мы могли вам помочь.

Reza 18.12.2018 17:08
stackblitz.com/edit/ionic-mm56rn @RezaRahmati
Lbook 18.12.2018 17:26
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
7
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В вашем коде есть несколько проблем

1. Ваши данные поступают как { success : { data : array} }, поэтому для доступа к данным вам необходимо сделать следующее.

  private extractData(res: any) {
    if (res && res.success && res.success.data) {
      return res.success.data;
    }
    return [];
  }

2. В вашем html вам нужно получить доступ к таким свойствам, как это

  <ion-item *ngFor = "let n of names">
    <h2>{{n?.strat_name}}</h2>
  </ion-item>

3. ваших данных слишком много, и они вызывают много задержек при отображении данных.

После всех исправлений это будет выглядеть так, как показано ниже.

https://stackblitz.com/edit/ionic-jb6ni9

Спасибо! задержка заставляет панель поиска не работать? @RezaRahmati

Lbook 18.12.2018 21:08

Lbook, вам нужно реализовать поиск и сортировку, кстати, angular категорически избегает использования канала поиска и сортировки. Кстати, если этот ответ решил вашу проблему, вы можете проголосовать за мой ответ и отметить его как ответ

Reza 18.12.2018 22:05

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