Я рвал на себе волосы, пытаясь проанализировать и использовать данные, возвращенные из запроса JSON / вызова API. Я не уверен, где именно я ошибся, мне кажется, что я обдумывал ответ несколько дней, гоняясь за различными кодами ошибок, например:
«Не удается найти поддерживающий объект канала 'iterableDiff'»
«Для универсального массива типов требуется один аргумент»
Ошибки синтаксического анализа JSON, и я уверен, что другие
Я предполагаю, что у меня просто неправильная комбинация исправлений.
Итак, вот краткое изложение ошибок и вещей, на которые стоит обратить внимание.
Сначала проверьте результат ваших вызовов API, ваши результаты могут быть в форме объекта, массива или массива объектов.
Я не буду вдаваться в подробности, достаточно сказать, что исходная ошибка OP из-за отсутствия итерации обычно вызвана тем, что вы пытаетесь выполнить итерацию объекта, а не массива.
Вот некоторые из моих результатов отладки, показывающие переменные как массивов, так и объектов
Итак, поскольку мы обычно хотели бы перебрать наш результат JSON, нам нужно убедиться, что он имеет форму массива. Я пробовал множество примеров и, возможно, зная то, что я знаю сейчас, некоторые из них на самом деле будут работать, но подход, который я использовал, действительно заключался в реализации канала, а код, который я использовал, заключался в том, что отправлено 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;
Честно говоря, я думаю, что одной из вещей, которые меня вызывали, было отсутствие обработки ошибок, добавив вызов `` return undefined '', я считаю, что теперь мы разрешаем отправку непредвиденных данных в канал, что, очевидно, происходило в моем случае ,
если вы не хотите иметь дело с аргументом канала (и посмотрите, я не думаю, что это необходимо в большинстве случаев), вы можете просто вернуть следующее
if (!obj)
return undefined;
return Object.keys(obj);
Некоторые примечания по созданию канала и страницы или компонента, использующего этот канал
я получал ошибки о том, что "name_of_my_pipe" не найдено
Используйте команду 'ionic generate pipe' из интерфейса командной строки, чтобы убедиться, что файлы pipe modules.ts созданы и указаны правильно. убедитесь, что вы добавили следующее на страницу mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(не уверен, что это изменится, если у вас также есть собственный custom_module, вам также может потребоваться добавить его в custommodule.module.ts)
если вы использовали команду 'ionic generate page' для создания своей страницы, но решили использовать эту страницу в качестве главной, не забудьте удалить ссылку на страницу из app.module.ts (вот еще один ответ, который я опубликовал, касающийся этого https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
В моем поиске ответов там, где есть несколько способов отображения данных в файле html, и я недостаточно понимаю, чтобы объяснить различия. Возможно, вам будет лучше использовать одно вместо другого в определенных сценариях.
<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>
Однако то, что сработало, позволило мне отобразить и значение, и ключ, было следующим:
<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>
чтобы вызвать API, похоже, вам нужно импортировать HttpModule в app.module.ts
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
и вам нужен Http на странице, с которой вы звоните
import {Http} from '@angular/http';
При вызове API кажется, что вы можете получить доступ к дочерним данным (объектам или массивам в массиве) двумя разными способами, либо они работают.
либо во время звонка
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
или когда вы назначаете данные своей локальной переменной
posts: Array<String>;
this.posts = myData['anyChildren'];
(не уверен, что эта переменная должна быть строкой массива, но это то, что у меня есть сейчас. Она может работать как более общая переменная)
И последнее замечание: не было необходимости использовать встроенную библиотеку JSON, однако вы можете найти эти 2 вызова удобными для преобразования из объекта в строку и наоборот.
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);
Я надеюсь, что эта подборка информации кому-то поможет.