2017-02-13 2 views
3

Ich ziehe Daten aus einer API für Rezepte, ich habe bereits eine Liste von Rezepten, die gut funktioniert, aber ich fordere jetzt eine einzelne Rezepte Details (1 Objekt). In meinem Konsolenprotokoll sehen Sie, wie der JSON aussieht. Was auch immer ich tue, kann ich nicht am Frontend anzeigen, bitte helfen Sie, wo Sie können.Single-Array-JSON-Objekt wird nicht gedruckt (Ionic 2)

JSON

Typoskript

details: any; 

loadDetails() { 
    if (this.details) { 
    return Promise.resolve(this.details); 
    } 

    return new Promise(resolve => { 
    this.http.get('http://api.yummly.com/v1/api/recipe/Crustless-Ham-Savory-Bake-2005439?_app_id=//////&_app_key=/////') 
     .map(res => res.json()) 
     .subscribe(data => { 
     console.log(data); 
     this.details = data; 
     resolve(this.details); 
     }); 
    }); 
} 

HTML

<ion-content> 
    <ion-list> 
     <ion-item> 
      <h1>{{details.id}}</h1> 
     </ion-item> 
    </ion-list> 
</ion-content> 

Pagename.ts

@Component({ 
    selector: 'page-details', 
    templateUrl: 'details.html', 
    providers: [ApiAuthentication] 

}) 
export class DetailsPage { 

    public api: any; 

    constructor(public navCtrl: NavController, public navParams: NavParams, public apiAuthentication: ApiAuthentication) { 
    this.loadRecipes(); 
    } 

    ionViewDidLoad() { 
    console.log('ionViewDidLoad DetailsPage'); 
    } 

    loadRecipes(){ 
    this.apiAuthentication.loadDetails() 
    .then(data => { 
     this.api = data; 
    }); 
    } 
} 
+1

Ich sehe keine Beschreibung irgendwo im zurückgegebenen Objekt. Du brauchst einen Schlüssel, um auf Details zugreifen zu können.id forst, um zu sehen, ob die ID gedruckt wird –

+0

@AniruddhaDas Sorry, ich habe mich jetzt zu ID geändert (hatte andere Werte) Ich erhalte einen Fehler von ** Eigenschaft 'id' von undefined nicht gelesen * * – BA1995

+0

@ BA1995. Es ist ein klassischer Fall von Async-Wert: Ihre Vorlage versucht, auf "details.id' ** zuzugreifen, bevor **" Details "tatsächlich definiert ist (sie wird NICHT sofort zugewiesen, da sie das Ergebnis einer asynchronen Kälte ist). Probieren Sie '{{details? .id}}' in Ihrer Vorlage aus. – AngularChef

Antwort

2

Sie versuchen

<h1>{{details.id}}</h1> 

anzuzeigen, wenn Sie in der Tat Ihr Objekt in api haben:

loadRecipes(){ 
    this.apiAuthentication.loadDetails() 
    .then(data => { 
     this.api = data; // you store it in api! 
    }); 

so sollte dies wahrscheinlich nur, wenn Sie Ihre Vorlage ein wenig ausgeräumt werden:

<h1>{{api.id}}</h1> 

und vielleicht fügen Sie hier auch den sicheren Navigationsoperator hinzu. {{api?.id}}

+0

Das ist großartig! Ich habe es nicht verstanden?'kann Sie durch den Fehler – BA1995

+1

Der sichere Navigation Operator Wards Null-Werte, können Sie hier mehr lesen: https://angular.io/docs/ts/latest/guide/template-syntax.html#!#safe-navigation- Operator Sie werden sich daran gewöhnen, dieses A LOT mit Angular zu verwenden, da wir ständig mit async arbeiten :) – Alex

0

Du viele Sache tatsächlich versuchen und kann mit einem getan werden die Tings.

Sie verwenden beide Versprechen und beobachtbar und Sie können eine von ihnen vermeiden. Ich würde sagen, benutze beobachtbar wie es standardmäßig kommt.

loadDetails() { 
    if (this.details) { 
    return null; 
    } 

    this.http.get('http://api.yummly.com/v1/api/recipe/Crustless-Ham-Savory-Bake-2005439?_app_id=//////&_app_key=/////') 
     //.map(res => res.json()) // you don't need this 
     .subscribe(data => { 
     console.log(data); // make sure the data is the object you are expecting and have the id property 
     this.details = data; // not necessary if you will use async pipe 
     }); 
    }); 
} 

hier details.id sollte verfügbar sein.

+0

Hallo, ich habe meine Frage bearbeitet, um die mehr Code ziehen diese Funktion, ich brauche auch die '.map (res => res.json())', um die JSON in ein Objekt zu konvertieren – BA1995