ฉันฉีกขนของฉันออกด้วยการพยายามแยกวิเคราะห์และใช้ข้อมูลที่ส่งคืนในรูปแบบการเรียกแบบสอบถาม JSON / api ฉันไม่แน่ใจว่าฉันผิดพลาดตรงไหนฉันรู้สึกเหมือนฉันวนเวียนหาคำตอบมาหลายวันไล่ตามรหัสข้อผิดพลาดต่างๆเช่น:
"ไม่พบวัตถุรองรับท่อ" iterableDiff ""
"อาร์เรย์ TYpe ทั่วไปต้องการอาร์กิวเมนต์เดียว"
JSON แยกวิเคราะห์ข้อผิดพลาดและฉันแน่ใจว่าคนอื่น ๆ
ฉันสมมติว่าฉันมีชุดค่าผสมที่ไม่ถูกต้อง
นี่คือข้อมูลสรุปของ gotchas และสิ่งที่ต้องค้นหา
ขั้นแรกให้ตรวจสอบผลลัพธ์ของการเรียก API ของคุณผลลัพธ์ของคุณอาจอยู่ในรูปของวัตถุอาร์เรย์หรืออาร์เรย์ของวัตถุ
ฉันจะไม่เข้าไปมากเกินไปพอที่จะบอกได้ว่าข้อผิดพลาดดั้งเดิมของ OP ที่ไม่สามารถทำซ้ำได้โดยทั่วไปเกิดจากคุณพยายามทำซ้ำวัตถุไม่ใช่ Array
นี่คือผลลัพธ์การดีบักบางส่วนของฉันที่แสดงตัวแปรของทั้งอาร์เรย์และวัตถุ
ดังนั้นโดยทั่วไปเราต้องการทำซ้ำผลลัพธ์ JSON ของเราเราจำเป็นต้องตรวจสอบให้แน่ใจว่าอยู่ในรูปแบบของ Array ฉันลองใช้ตัวอย่างมากมายและบางทีอาจจะรู้ว่าตอนนี้ฉันรู้ว่าบางส่วนจะใช้งานได้จริง แต่วิธีที่ฉันใช้คือการใช้ไปป์และรหัสที่ฉันใช้คือโพสต์โดย 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 เพื่อให้แน่ใจว่าโมดูลท่อสร้างและอ้างอิงอย่างถูกต้อง ให้แน่ใจว่าคุณเพิ่มสิ่งต่อไปนี้ในหน้า 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 คุณดูเหมือนจะสามารถเข้าถึงข้อมูลลูก ๆ ได้ (วัตถุหรืออาร์เรย์ภายในอาร์เรย์) 2 วิธีที่แตกต่างกันดูเหมือนจะได้ผล
ทั้งในระหว่างการโทร
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
หรือเมื่อคุณกำหนดข้อมูลให้กับตัวแปรภายในเครื่องของคุณ
posts: Array<String>;
this.posts = myData['anyChildren'];
(ไม่แน่ใจว่าตัวแปรนั้นจำเป็นต้องเป็น Array String หรือไม่ แต่นั่นคือสิ่งที่ฉันมีในตอนนี้มันอาจทำงานเป็นตัวแปรทั่วไปมากกว่า)
และหมายเหตุสุดท้ายไม่จำเป็นต้องใช้ไลบรารี 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);
ฉันหวังว่าการรวบรวมข้อมูลนี้จะช่วยใครบางคนได้