J'essaie de charger un événement depuis mon API avant que le composant ne soit rendu. Actuellement, j'utilise mon service API que j'appelle depuis la fonction ngOnInit du composant.
Mon EventRegistercomposant:
import {Component, OnInit, ElementRef} from "angular2/core";
import {ApiService} from "../../services/api.service";
import {EventModel} from '../../models/EventModel';
import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig, RouteParams, RouterLink} from 'angular2/router';
import {FORM_PROVIDERS, FORM_DIRECTIVES, Control} from 'angular2/common';
@Component({
selector: "register",
templateUrl: "/events/register"
// provider array is added in parent component
})
export class EventRegister implements OnInit {
eventId: string;
ev: EventModel;
constructor(private _apiService: ApiService,
params: RouteParams) {
this.eventId = params.get('id');
}
fetchEvent(): void {
this._apiService.get.event(this.eventId).then(event => {
this.ev = event;
console.log(event); // Has a value
console.log(this.ev); // Has a value
});
}
ngOnInit() {
this.fetchEvent();
console.log(this.ev); // Has NO value
}
}
Mon EventRegistermodèle
<register>
Hi this sentence is always visible, even if `ev property` is not loaded yet
<div *ngIf="ev">
I should be visible as soon the `ev property` is loaded. Currently I am never shown.
<span>{{event.id }}</span>
</div>
</register>
Mon service API
import "rxjs/Rx"
import {Http} from "angular2/http";
import {Injectable} from "angular2/core";
import {EventModel} from '../models/EventModel';
@Injectable()
export class ApiService {
constructor(private http: Http) { }
get = {
event: (eventId: string): Promise<EventModel> => {
return this.http.get("api/events/" + eventId).map(response => {
return response.json(); // Has a value
}).toPromise();
}
}
}
Le composant est rendu avant que l'appel d'API dans la ngOnInitfonction ne récupère les données. Je ne vois donc jamais l'ID d'événement dans mon modèle de vue. Il semble donc que ce soit un problème ASYNC. Je m'attendais à ce que la liaison du ev( EventRegistercomposant) fasse un certain travail une fois la evpropriété définie. Malheureusement, il n'affiche pas le divmarqué avec *ngIf="ev"lorsque la propriété est définie.
Question: Est-ce que j'utilise une bonne approche? Si non; Quelle est la meilleure façon de charger des données avant que le composant ne commence à être rendu?
REMARQUE: l' ngOnInitapproche est utilisée dans ce didacticiel angular2 .
ÉDITER:
Deux solutions possibles. La première était d'abandonner le fetchEventet d'utiliser simplement le service API dans la ngOnInitfonction.
ngOnInit() {
this._apiService.get.event(this.eventId).then(event => this.ev = event);
}
Deuxième solution. Comme la réponse donnée.
fetchEvent(): Promise<EventModel> {
return this._apiService.get.event(this.eventId);
}
ngOnInit() {
this.fetchEvent().then(event => this.ev = event);
}

fetchEventfonction entière et mis simplement laapiService.get.eventfonction dans lengOnInitet cela a fonctionné comme prévu. Merci! J'accepterai votre réponse dès que cela me le permettra aussi.