Sto cercando di caricare un evento dalla mia API prima che il componente venga visualizzato. Attualmente sto usando il mio servizio API che chiamo dalla funzione ngOnInit del componente.
Il mio EventRegistercomponente:
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
}
}
Il mio EventRegistermodello
<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>
Il mio servizio 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();
}
}
}
Il componente viene renderizzato prima che la chiamata API nella ngOnInitfunzione venga eseguita recuperando i dati. Quindi non riesco mai a vedere l'ID evento nel mio modello di visualizzazione. Quindi sembra che questo sia un problema ASYNC. Mi aspettavo che il binding del ev( EventRegistercomponente) facesse un po 'di lavoro dopo aver evimpostato la proprietà. Purtroppo non mostra il divcontrassegnato con *ngIf="ev"quando viene impostata la proprietà.
Domanda: sto usando un buon approccio? Altrimenti; Qual è il modo migliore per caricare i dati prima che il componente inizi a eseguire il rendering?
NOTA: l' ngOnInitapproccio è utilizzato in questo tutorial di angular2 .
MODIFICARE:
Due possibili soluzioni. Il primo era quello di abbandonare fetchEvente usare semplicemente il servizio API nella ngOnInitfunzione.
ngOnInit() {
this._apiService.get.event(this.eventId).then(event => this.ev = event);
}
Seconda soluzione. Come la risposta data.
fetchEvent(): Promise<EventModel> {
return this._apiService.get.event(this.eventId);
}
ngOnInit() {
this.fetchEvent().then(event => this.ev = event);
}

fetchEventfunzione e ho appena inserito laapiService.get.eventfunzionengOnInite ha funzionato come intendo. Grazie! Accetterò la tua risposta non appena me lo consentirà.