Я розривав волосся, намагаючись розібратися і використовувати дані, повернуті з JSON-запиту / виклику api. Я не впевнений, де саме я пішов не так, я відчуваю, що цілий день кружляв відповідь, переслідуючи різні коди помилок, як-от:
"Неможливо знайти" iterableDiff "підтримуючий об'єкт"
"Для загального масиву TYpe потрібен один аргумент (и)"
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;
Чесно кажучи, я думаю, що однією з речей, яка мене викликала, було відсутність обробки помилок, додавши дзвінок "повернути невизначений", я вважаю, що ми зараз дозволяємо надсилати в трубу не очікувані дані, що, очевидно, відбувалося в моєму випадку .
якщо ви не хочете мати справу з аргументом до труби (і я думаю, я не думаю, що це потрібно в більшості випадків), ви можете просто повернути наступне
if (!obj)
return undefined;
return Object.keys(obj);
Деякі примітки щодо створення вашої труби та сторінки або компонента, який використовує цю трубу
це я отримував помилки про те, що "name_of_my_pipe" не знайдено
Використовуйте команду "Іонна генерація труби" від CLI, щоб переконатися, що трубові модулі.ts створені та посилаються правильно. переконайтеся, що ви додали наступне на сторінку mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(не впевнений, що це зміниться, якщо у вас також є власний custom_module, можливо, вам також доведеться додати його до custommodule.module.ts)
якщо ви використовували команду "Іонна генерувати сторінку" для створення своєї сторінки, але вирішили використовувати цю сторінку як свою головну сторінку, не забудьте видалити посилання на сторінку з 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 виклики зручними для перетворення об’єкта в рядок і vica навпаки
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);
Я сподіваюся, що ця збірка інформації допоможе комусь.