Comment faire pour extraire des données JSON à partir de l'adresse http.obtenir Angulaire 2 correctement?
Je n'arrive pas à gérer pour créer une variable pour l'afficher avec les informations d'un fichier json, mais je suis si proche. Je peux l'écho de l'information dans le .subscribe()
de la chaîne, mais il ne sera pas affecter une variable, ils sont juste pas défini, ce que je fais mal?
Je veux juste pour charger mon fichier json dans une variable dans la vue component. Il était facile Angulaire 1.
Mon service:
import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/map';
import {Observable} from 'rxjs/Rx';
@Injectable()
export class GullkornService {
result: any;
constructor(private http:Http) {
}
getGullkorn() {
let result = this.result;
this.http.get('./gk/gullkorn.json')
.map(res => res.json())
.subscribe(
val => this.result = val,
err => console.error(err),
() => console.log(this.result)); //this one echoes out what i want
console.log(this.result); //but this one doesnt, so i cant return it
}
}
Et l'atterrissage composant:
import { Component, OnInit } from '@angular/core';
import {Router, RouterOutlet} from '@angular/router';
import { HttpModule, JsonpModule } from '@angular/http';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { GullkornService } from '../../gullkorn-service.service';
import { FormsModule } from '@angular/forms';
import {Observable} from 'rxjs/Observable';
import "gsap";
declare var ease, TimelineMax,TweenMax,Power4,Power1,Power2,Power3,Bounce, Elastic:any;
@Component({
selector: 'gullkorn-visning',
providers: [GullkornService],
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.css']
})
export class LandingComponent implements OnInit {
gullkorn: any;
constructor(GullkornService: GullkornService) {
this.gullkorn = GullkornService.getGullkorn();
console.log(this.gullkorn);
}
ngOnInit() {
}
}
Basé sur le code actuel, c'est ce que j'obtiens:
J'ai le projet ici: github.
Vous devez vous connecter pour publier un commentaire.
C'est une opération asynchrone, de sorte que lorsque vous essayez de console.journal le résultat c'est pas définie, il est en cours d'exécution avant l'autre console.journal à l'intérieur de l'abonnement.
Je voudrais faire quelques changements dans votre code... je vous conseille de prendre soin de l'abonnement dans le composant à la place, ce serait la meilleure façon de gérer http demandes. Donc, juste
map
dans le service et le retour de la observables à la pièce, n'oubliez pas d'ajouterreturn
déclaration :Dans votre composant, je vous suggère de déplacer votre appel de service dans
OnInit
à la place. Ici, vous pouvez également remarquer que les valeurs ne sont pas immédiatement accessibles à l'extérieur de l'abonnement, comme pour les commentaires dans le code. Donc, si vous voulez manipuler vos données en quelque sorte, vous avez besoin de prendre cela en considération 🙂QUE c'est une opération asynchrone, alors soyez prêt à utiliser
ngIf
ou la la sécurité de la navigation de l'opérateur de votre point de vue, puisque la vue est rendue avant que les données ont été récupérées.Donc, soit l'enveloppe de votre code à l'intérieur de
ngIf
:ou
{{gullkorn?.someProperty}}
C'est mieux pour revenir le observable du service et de vous y abonner pour le composant:
service:
composant:
ngOnInit
et de désabonnement dansngOnDestroy