Я пытаюсь получить данные из 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.
не могли бы вы добавить это в свой html (сразу после кнопки сортировки) и поделиться результатом {{names | json}}
это правильно? <button ion-button type = "button" (click) = "sort ()"> Сортировать </button> {{имена | json}} поэтому я получаю items.filer не функция @RezaRahmati
json pipe просто отображает ваш объект как json в вашем html, поэтому это не вызовет этой проблемы, но также это означает, что в вашем коде есть проблема, поэтому для ее отслеживания удалите | search : terms | sort: {property: column, order: order}
из вашего ion-item
@RezaRahmati, теперь я получаю сообщение об ошибке при попытке сравнить "{Object Object}". разрешены только массивы и итерации
Хорошо, сделайте это, перейдите на stackblitz.com и создайте там проект, попробуйте воспроизвести проблему и поделитесь ссылкой здесь, чтобы мы могли вам помочь.
В вашем коде есть несколько проблем
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, вам нужно реализовать поиск и сортировку, кстати, angular категорически избегает использования канала поиска и сортировки. Кстати, если этот ответ решил вашу проблему, вы можете проголосовать за мой ответ и отметить его как ответ
Привет! у вас есть ошибка? не могли бы вы зарегистрировать ответ сервера и содержимое имен после ответа api в home.ts?