Saya mencoba memuat acara dari API saya sebelum komponen dirender. Saat ini saya menggunakan layanan API yang saya panggil dari fungsi ngOnInit komponen.
EventRegisterKomponen saya :
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
}
}
EventRegisterTemplate saya
<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>
Layanan API saya
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();
}
}
}
Komponen dirender sebelum panggilan API dalam ngOnInitfungsi selesai mengambil data. Jadi saya tidak pernah bisa melihat id acara di template tampilan saya. Jadi sepertinya ini adalah masalah ASYNC. Saya mengharapkan pengikatan ev( EventRegisterkomponen) untuk melakukan beberapa pekerjaan setelah evproperti ditetapkan. Sayangnya itu tidak menunjukkan divditandai dengan *ngIf="ev"saat properti ditetapkan.
Pertanyaan: Apakah saya menggunakan pendekatan yang baik? Jika tidak; Apa cara terbaik untuk memuat data sebelum komponen mulai dirender?
CATATAN: The ngOnInitPendekatan yang digunakan dalam tutorial angular2 .
EDIT:
Dua solusi yang mungkin. Pertama adalah membuang fetchEventdan hanya menggunakan layanan API dalam ngOnInitfungsinya.
ngOnInit() {
this._apiService.get.event(this.eventId).then(event => this.ev = event);
}
Solusi kedua. Seperti jawaban yang diberikan.
fetchEvent(): Promise<EventModel> {
return this._apiService.get.event(this.eventId);
}
ngOnInit() {
this.fetchEvent().then(event => this.ev = event);
}

fetchEventfungsi dan hanya menempatkanapiService.get.eventfungsi dingOnInitdan itu bekerja seperti yang saya inginkan. Terima kasih! Saya akan menerima jawaban Anda segera setelah mengizinkan saya juga.