Me he estado arrancando el pelo al tratar de analizar y usar los datos devueltos de una consulta JSON / llamada de API. No estoy seguro exactamente de dónde estaba yendo mal, siento que he estado circulando la respuesta durante días, persiguiendo varios códigos de error como:
"No se puede encontrar el objeto de soporte de tubería 'iterableDiff'"
"La matriz de tipos genérica requiere uno o más argumentos"
Errores de análisis JSON, y estoy seguro de que otros
Supongo que acabo de tener la combinación incorrecta de correcciones.
Así que aquí hay un resumen de las trampas y cosas que debe buscar.
Primero verifique el resultado de sus llamadas a la API, sus resultados pueden ser en forma de un objeto, una matriz o una matriz de objetos.
No voy a profundizar demasiado, basta con decir que el error original del OP de no ser iterable generalmente es causado por tratar de iterar un objeto, no una matriz.
He aquí algunos de mis resultados de depuración que muestran variables de matrices y objetos.
Entonces, como generalmente nos gustaría iterar sobre nuestro resultado JSON, debemos asegurarnos de que tenga la forma de una matriz. Intenté numerosos ejemplos, y tal vez sabiendo lo que sé ahora, algunos de ellos funcionarían, pero el enfoque que utilicé fue implementar una tubería y el código que utilicé fue el publicado por 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;
Honestamente, creo que una de las cosas que me atrapó fue la falta de manejo de errores, al agregar la llamada 'devolver indefinido' creo que ahora estamos permitiendo que se envíen datos no esperados a la tubería, lo que obviamente estaba ocurriendo en mi caso .
si no desea lidiar con el argumento de la tubería (y mira, no creo que sea necesario en la mayoría de los casos) puede devolver lo siguiente
if (!obj)
return undefined;
return Object.keys(obj);
Algunas notas sobre cómo crear su tubería y página o componente que usa esa tubería
es que estaba recibiendo errores sobre 'nombre_de_mi_pipe' no encontrado
Use el comando 'iónico generar tubería' de la CLI para asegurarse de que los módulos de tubería.ts se creen y hagan referencia correctamente. asegúrese de agregar lo siguiente a la página mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(no estoy seguro si esto cambia si también tiene su propio custom_module, es posible que también deba agregarlo a custommodule.module.ts)
si usó el comando 'generar página iónica' para crear su página, pero decide usar esa página como su página principal, recuerde eliminar la referencia de la página de app.module.ts (aquí hay otra respuesta que publiqué sobre ese https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
En mi búsqueda de respuestas, hubo varias formas de mostrar los datos en el archivo html, y no entiendo lo suficiente como para explicar las diferencias. Puede que le resulte mejor usar uno sobre otro en ciertos escenarios.
<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>
Sin embargo, lo que funcionó que me permitió mostrar tanto el valor como la clave fue lo siguiente:
<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>
para hacer que la llamada a la API parezca que necesita importar HttpModule en app.module.ts
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
y necesita Http en la página desde la que realiza la llamada
import {Http} from '@angular/http';
Al hacer la llamada API, parece que puede acceder a los datos secundarios (los objetos o matrices dentro de la matriz) 2 formas diferentes, o parece funcionar
ya sea durante la llamada
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
o cuando asigna los datos a su variable local
posts: Array<String>;
this.posts = myData['anyChildren'];
(no estoy seguro si esa variable necesita ser una Cadena de matriz, pero eso es lo que tengo ahora. Puede funcionar como una variable más genérica)
Y nota final, no era necesario usar la biblioteca JSON incorporada, sin embargo, puede encontrar estas 2 llamadas útiles para convertir de un objeto a una cadena y 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);
Espero que esta compilación de información ayude a alguien.