Tenho arrancado os cabelos tentando analisar e usar os dados retornados de uma chamada JSON query / api. Não sei exatamente onde estava errado, sinto que tenho circulado a resposta por dias, perseguindo vários códigos de erro como:
"Não foi possível encontrar o objeto de suporte do tubo 'iterableDiff'"
"Matriz TYpe genérica requer um ou mais argumentos"
Erros de análise de JSON e tenho certeza que outros
Estou assumindo que apenas tive a combinação errada de correções.
Então, aqui está um resumo de dicas e coisas para procurar.
Em primeiro lugar, verifique o resultado de suas chamadas de API, seus resultados podem estar na forma de um objeto, uma matriz ou uma matriz de objetos.
eu não vou falar muito sobre isso, basta dizer que o erro original do OP de não ser iterável geralmente é causado por você tentar iterar um objeto, não uma matriz.
Heres alguns dos meus resultados de depuração mostrando variáveis de matrizes e objetos
Portanto, como geralmente queremos iterar sobre nosso resultado JSON, precisamos garantir que ele esteja na forma de uma matriz. Tentei vários exemplos e, talvez, sabendo o que sei agora, alguns deles realmente funcionariam, mas a abordagem com que eu fui foi realmente implementar um pipe e o código que usei foi o postado 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;
Sinceramente, acho que uma das coisas que me motivou foi a falta de tratamento de erros. Ao adicionar a chamada 'return undefined', acredito que agora estamos permitindo que dados não esperados sejam enviados ao canal, o que obviamente estava ocorrendo no meu caso .
se você não quiser lidar com argumentos para o canal (e veja, eu acho que não é necessário na maioria dos casos), basta retornar o seguinte
if (!obj)
return undefined;
return Object.keys(obj);
Algumas notas sobre como criar seu canal e página ou componente que usa esse canal
é que eu estava recebendo erros sobre 'nome_do_meu_pipe' não sendo encontrado
Use o comando 'ionic generate pipe' da CLI para garantir que os pipes.ts sejam criados e referenciados corretamente. verifique se você adicionou o seguinte à página mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(não tenho certeza se isso muda se você também tiver seu próprio custom_module, talvez seja necessário adicioná-lo ao custommodule.module.ts)
se você usou o comando 'ionic generate page' para criar sua página, mas decide usar essa página como sua página principal, lembre-se de remover a referência da página do app.module.ts (aqui está outra resposta que eu postei sobre esse https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
Na minha busca por respostas, há várias maneiras de exibir os dados no arquivo html, e eu não entendo o suficiente para explicar as diferenças. Você pode achar melhor usar um sobre o outro em certos cenários.
<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>
No entanto, o que funcionou que me permitiu exibir o valor e a chave foi o seguinte:
<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 fazer a chamada da API, parece que você precisa importar o HttpModule para app.module.ts
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
e você precisa de Http na página da qual faz a ligação
import {Http} from '@angular/http';
Ao fazer a chamada da API, parece que você consegue acessar os dados filhos (os objetos ou as matrizes dentro da matriz) de 2 maneiras diferentes, que parecem funcionar
durante a chamada
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
ou quando você atribui os dados à sua variável local
posts: Array<String>;
this.posts = myData['anyChildren'];
(não tenho certeza se essa variável precisa ser uma String de matriz, mas é isso que eu tenho agora. Pode funcionar como uma variável mais genérica)
E nota final, não foi necessário usar a biblioteca JSON embutida, no entanto, você pode encontrar essas 2 chamadas úteis para converter de um objeto em uma string e 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);
Espero que esta compilação de informações ajude alguém.