Ich habe mir die Haare ausgerissen, als ich versucht habe, Daten zu analysieren und zu verwenden, die von einem JSON-Abfrage- / API-Aufruf zurückgegeben wurden. Ich bin mir nicht sicher, wo genau ich falsch gelaufen bin. Ich habe das Gefühl, dass ich die Antwort seit Tagen umkreise und verschiedene Fehlercodes wie:
"Kann 'iterableDiff'-Pipe-unterstützendes Objekt nicht finden"
"Generisches TYpe-Array erfordert ein oder mehrere Argumente"
JSON-Analysefehler und andere sicher
Ich gehe davon aus, dass ich gerade die falsche Kombination von Korrekturen hatte.
Hier ist eine kurze Zusammenfassung der Fallstricke und Dinge, nach denen gesucht werden muss.
Überprüfen Sie zunächst das Ergebnis Ihrer API-Aufrufe. Ihre Ergebnisse können in Form eines Objekts, eines Arrays oder eines Arrays von Objekten vorliegen.
Ich werde nicht zu viel darauf eingehen. Es reicht zu sagen, dass der ursprüngliche Fehler des OP, nicht iterierbar zu sein, im Allgemeinen dadurch verursacht wird, dass Sie versuchen, ein Objekt und kein Array zu iterieren.
Hier sind einige meiner Debugging-Ergebnisse, die Variablen sowohl von Arrays als auch von Objekten zeigen
Da wir unser JSON-Ergebnis im Allgemeinen iterieren möchten, müssen wir sicherstellen, dass es die Form eines Arrays hat. Ich habe zahlreiche Beispiele ausprobiert und vielleicht wusste ich, was ich jetzt weiß, einige davon würden tatsächlich funktionieren, aber der Ansatz, den ich gewählt habe, bestand darin, eine Pipe zu implementieren, und der Code, den ich verwendete, war der von t.888 gepostete
transform(obj: {[key: string]: any}, arg: string) {
if (!obj)
return undefined;
return arg === 'keyval' ?
Object.keys(obj).map((key) => ({ 'key': key, 'value': obj[key] })) :
arg === 'key' ?
Object.keys(obj) :
arg === 'value' ?
Object.keys(obj).map(key => obj[key]) :
null;
Ehrlich gesagt denke ich, eines der Dinge, die mich dazu gebracht haben, war das Fehlen einer Fehlerbehandlung, indem ich den Aufruf 'return undefined' hinzufügte, von dem ich glaube, dass wir jetzt zulassen, dass nicht erwartete Daten an die Pipe gesendet werden, was offensichtlich in meinem Fall vorkam .
Wenn Sie sich nicht mit Argumenten für die Pipe befassen möchten (und ich denke, dass dies in den meisten Fällen nicht notwendig ist), können Sie einfach Folgendes zurückgeben
if (!obj)
return undefined;
return Object.keys(obj);
Einige Hinweise zum Erstellen Ihrer Pipe und Seite oder Komponente, die diese Pipe verwendet
Ich habe Fehler erhalten, dass 'name_of_my_pipe' nicht gefunden wurde
Verwenden Sie den Befehl 'ionic generate pipe' von der CLI, um sicherzustellen, dass die Rohrmodule.ts korrekt erstellt und referenziert werden. Stellen Sie sicher, dass Sie der Seite mypage.module.ts Folgendes hinzufügen.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(Sie sind sich nicht sicher, ob sich dies ändert, wenn Sie auch über ein eigenes custom_module verfügen. Möglicherweise müssen Sie es auch zur custommodule.module.ts hinzufügen.)
Wenn Sie den Befehl 'ionic generate page' verwendet haben, um Ihre Seite zu erstellen, diese Seite jedoch als Hauptseite verwenden möchten, denken Sie daran, den Seitenverweis aus app.module.ts zu entfernen (hier ist eine weitere Antwort, die ich dazu veröffentlicht habe https : / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
Bei meiner Suche nach Antworten gab es eine Reihe von Möglichkeiten, die Daten in der HTML-Datei anzuzeigen, und ich verstehe nicht genug, um die Unterschiede zu erklären. In bestimmten Szenarien ist es möglicherweise besser, sie übereinander zu verwenden.
<ion-item *ngFor="let myPost of posts">
<img src="https://somwhereOnTheInternet/{{myPost.ImageUrl}}"/>
<img src="https://somwhereOnTheInternet/{{posts[myPost].ImageUrl}}"/>
<img [src]="'https://somwhereOnTheInternet/' + myPost.ImageUrl" />
</ion-item>
Was jedoch funktionierte, das es mir ermöglichte, sowohl den Wert als auch den Schlüssel anzuzeigen, war Folgendes:
<ion-list>
<ion-item *ngFor="let myPost of posts | name_of_pip:'optional_Str_Varible'">
<h2>Key Value = {{posts[myPost]}}
<h2>Key Name = {{myPost}} </h2>
</ion-item>
</ion-list>
Um den API-Aufruf durchzuführen, müssen Sie HttpModule in app.module.ts importieren
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
und Sie benötigen HTTP auf der Seite, von der aus Sie den Anruf tätigen
import {Http} from '@angular/http';
Wenn Sie den API-Aufruf ausführen, scheinen Sie in der Lage zu sein, auf zwei verschiedene Arten auf die untergeordneten Daten (die Objekte oder Arrays innerhalb des Arrays) zuzugreifen. Beide scheinen zu funktionieren
entweder während des Anrufs
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
oder wenn Sie die Daten Ihrer lokalen Variablen zuweisen
posts: Array<String>;
this.posts = myData['anyChildren'];
(Ich bin mir nicht sicher, ob diese Variable ein Array-String sein muss, aber das ist es, was ich jetzt habe. Es kann als allgemeinere Variable funktionieren.)
Und zum Schluss war es nicht notwendig, die eingebaute JSON-Bibliothek zu verwenden. Diese beiden Aufrufe können jedoch nützlich sein, um von einem Objekt in einen String zu konvertieren und umgekehrt
var stringifiedData = JSON.stringify(this.movies);
console.log("**mResults in Stringify");
console.log(stringifiedData);
var mResults = JSON.parse(<string>stringifiedData);
console.log("**mResults in a JSON");
console.log(mResults);
Ich hoffe, diese Zusammenstellung von Informationen hilft jemandem.