Mi sono strappato i capelli cercando di analizzare e utilizzare i dati restituiti da una chiamata JSON query / api. Non sono sicuro di dove stavo sbagliando, mi sento come se stessi cercando la risposta da giorni, inseguendo vari codici di errore come:
"Impossibile trovare l'oggetto di supporto pipe 'iterableDiff'"
"L'array TYPE generico richiede un argomento (i)"
JSON analizza gli errori e ne sono sicuro altri
Immagino di aver appena avuto la combinazione sbagliata di correzioni.
Quindi ecco un piccolo riassunto di gotcha e cose da cercare.
Innanzitutto controlla il risultato delle tue chiamate api, i risultati potrebbero essere sotto forma di un oggetto, un array o un array di oggetti.
non ci entrerò troppo, basti dire che l'errore originale dell'OP di non essere iterabile è generalmente causato dal tentativo di iterare un oggetto, non una matrice.
Ecco alcuni dei miei risultati di debug che mostrano variabili di matrici e oggetti
Pertanto, poiché in genere vorremmo ripetere il nostro risultato JSON, dobbiamo assicurarci che sia sotto forma di array. Ho provato numerosi esempi, e forse sapendo quello che so ora alcuni di questi avrebbero effettivamente funzionato, ma l'approccio che ho seguito è stato davvero quello di implementare una pipe e il codice che ho usato è stato quello pubblicato da t.888
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;
Sinceramente penso che una delle cose che mi ha procurato sia stata la mancanza di gestione degli errori, aggiungendo la chiamata 'return indefined' credo che ora stiamo permettendo l'invio di dati non previsti alla pipe, che ovviamente si stavano verificando nel mio caso .
se non vuoi trattare l'argomento con la pipe (e guarda non penso che sia necessario nella maggior parte dei casi) puoi semplicemente restituire quanto segue
if (!obj)
return undefined;
return Object.keys(obj);
Alcune note sulla creazione della pipe e della pagina o del componente che utilizza quella pipe
sto ricevendo errori su "name_of_my_pipe" non trovato?
Utilizzare il comando 'ionic generate pipe' dalla CLI per assicurarsi che i moduli pipe.ts vengano creati e referenziati correttamente. assicurati di aggiungere quanto segue alla pagina mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(non sono sicuro che questo cambi se hai anche il tuo custom_module, potresti anche doverlo aggiungere a custommodule.module.ts)
se hai usato il comando 'ionic generate page' per creare la tua pagina, ma decidi di usare quella pagina come tua pagina principale, ricordati di rimuovere il riferimento della pagina da app.module.ts (ecco un'altra risposta che ho postato trattando quella https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
Nella mia ricerca di risposte là dove un certo numero di modi per visualizzare i dati nel file html, e non capisco abbastanza per spiegare le differenze. Potrebbe essere meglio usarne uno sopra l'altro in determinati scenari.
<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>
Tuttavia ciò che ha funzionato che mi ha permesso di visualizzare sia il valore che la chiave è stato il seguente:
<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>
per chiamare l'API sembra che sia necessario importare HttpModule in app.module.ts
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
e hai bisogno di Http nella pagina da cui effettui la chiamata
import {Http} from '@angular/http';
Quando si effettua la chiamata API, sembra che si riesca a ottenere i dati secondari (gli oggetti o le matrici all'interno dell'array) in 2 modi diversi, entrambi sembrano funzionare
sia durante la chiamata
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
o quando assegni i dati alla tua variabile locale
posts: Array<String>;
this.posts = myData['anyChildren'];
(non sono sicuro se quella variabile debba essere una stringa di array, ma questo è quello che ho adesso. Potrebbe funzionare come una variabile più generica)
E nota finale, non è stato necessario utilizzare la libreria JSON integrata, tuttavia è possibile trovare utili queste 2 chiamate per la conversione da un oggetto a una stringa e viceversa
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);
Spero che questa raccolta di informazioni aiuti qualcuno.