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 EventRegister
componente:
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 EventRegister
modello
<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 ngOnInit
funzione 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
( EventRegister
componente) facesse un po 'di lavoro dopo aver ev
impostato la proprietà. Purtroppo non mostra il div
contrassegnato 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' ngOnInit
approccio è utilizzato in questo tutorial di angular2 .
MODIFICARE:
Due possibili soluzioni. Il primo era quello di abbandonare fetchEvent
e usare semplicemente il servizio API nella ngOnInit
funzione.
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);
}
fetchEvent
funzione e ho appena inserito laapiService.get.event
funzionengOnInit
e ha funzionato come intendo. Grazie! Accetterò la tua risposta non appena me lo consentirà.