Je me suis déchiré les cheveux en essayant d'analyser et d'utiliser les données renvoyées par une requête JSON / un appel API. Je ne sais pas exactement où je me suis trompé, j'ai l'impression d'avoir encerclé la réponse pendant des jours, chassant divers codes d'erreur tels que:
"Impossible de trouver l'objet de prise en charge du tube 'iterableDiff'"
"Le tableau TYpe générique nécessite un ou plusieurs arguments"
Erreurs d'analyse JSON, et je suis sûr que d'autres
Je suppose que j'ai juste eu la mauvaise combinaison de correctifs.
Voici donc un résumé des pièges et des choses à rechercher.
Tout d'abord, vérifiez le résultat de vos appels API, vos résultats peuvent être sous la forme d'un objet, d'un tableau ou d'un tableau d'objets.
Je ne vais pas trop y entrer, il suffit de dire que l'erreur d'origine de l'OP de ne pas être itérable est généralement due au fait que vous essayez d'itérer un objet, pas un tableau.
Voici certains de mes résultats de débogage montrant les variables des tableaux et des objets
Ainsi, comme nous souhaitons généralement itérer sur notre résultat JSON, nous devons nous assurer qu'il se présente sous la forme d'un tableau. J'ai essayé de nombreux exemples, et sachant peut-être ce que je sais maintenant, certains d'entre eux fonctionneraient en fait, mais l'approche que j'ai suivie était en effet d'implémenter un tube et le code que j'ai utilisé était celui publié par 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;
Honnêtement, je pense que l'une des choses qui m'obtenait était le manque de gestion des erreurs, en ajoutant l'appel `` return undefined '', je pense que nous permettons maintenant d'envoyer des données non attendues au tuyau, ce qui se produisait évidemment dans mon cas. .
si vous ne voulez pas traiter d'argument dans le tube (et regardez, je ne pense pas que ce soit nécessaire dans la plupart des cas), vous pouvez simplement retourner ce qui suit
if (!obj)
return undefined;
return Object.keys(obj);
Quelques notes sur la création de votre tube et de votre page ou composant qui utilise ce tube
est-ce que je recevais des erreurs indiquant que 'name_of_my_pipe' était introuvable
Utilisez la commande 'ionic generate pipe' de l'interface de ligne de commande pour vous assurer que les modules de canalisation.ts sont créés et référencés correctement. assurez-vous d'ajouter ce qui suit à la page mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(je ne sais pas si cela change si vous avez également votre propre custom_module, vous devrez peut-être également l'ajouter à custommodule.module.ts)
si vous avez utilisé la commande 'ionic generate page' pour créer votre page, mais que vous décidez d'utiliser cette page comme page principale, n'oubliez pas de supprimer la référence de page de app.module.ts (voici une autre réponse que j'ai publiée concernant ce https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
Dans ma recherche de réponses, il existe un certain nombre de façons d'afficher les données dans le fichier html, et je ne comprends pas assez pour expliquer les différences. Vous trouverez peut-être préférable de les utiliser les uns par rapport aux autres dans certains scénarios.
<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>
Cependant, ce qui a fonctionné qui m'a permis d'afficher à la fois la valeur et la clé était le suivant:
<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>
pour faire l'appel d'API, il semble que vous deviez importer HttpModule dans app.module.ts
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
et vous avez besoin de Http dans la page à partir de laquelle vous passez l'appel
import {Http} from '@angular/http';
Lors de l'appel à l'API, vous semblez être en mesure d'accéder aux données enfants (les objets ou les tableaux dans le tableau) de 2 manières différentes, qui semblent fonctionner
soit pendant l'appel
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
ou lorsque vous affectez les données à votre variable locale
posts: Array<String>;
this.posts = myData['anyChildren'];
(je ne sais pas si cette variable doit être une chaîne de tableau, mais c'est ce que je l'ai actuellement. Cela peut fonctionner comme une variable plus générique)
Et note finale, il n'était pas nécessaire d'utiliser la bibliothèque JSON intégrée, mais vous pouvez trouver ces 2 appels pratiques pour la conversion d'un objet en une chaîne et vice versa
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);
J'espère que cette compilation d'informations aidera quelqu'un.