Tôi đang cố tải một sự kiện từ API của mình trước khi thành phần được hiển thị. Hiện tại tôi đang sử dụng dịch vụ API mà tôi gọi từ chức năng ngOnInit của thành phần.
EventRegister
Thành phần của tôi :
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
}
}
EventRegister
Mẫu của tôi
<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>
Dịch vụ API của tôi
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();
}
}
}
Thành phần được kết xuất trước khi lệnh gọi API trong ngOnInit
hàm được thực hiện tìm nạp dữ liệu. Vì vậy, tôi không bao giờ có thể nhìn thấy id sự kiện trong mẫu xem của tôi. Vì vậy, có vẻ như đây là một vấn đề ASYNC. Tôi dự kiến ràng buộc của ev
( EventRegister
thành phần) để thực hiện một số công việc sau khi thuộc ev
tính được thiết lập. Đáng buồn thay, nó không hiển thị div
được đánh dấu *ngIf="ev"
khi tài sản được thiết lập.
Câu hỏi: Tôi có đang sử dụng một cách tiếp cận tốt? Nếu không; Cách tốt nhất để tải dữ liệu trước khi thành phần bắt đầu kết xuất là gì?
LƯU Ý: Cách ngOnInit
tiếp cận được sử dụng trong hướng dẫn angular2 này .
BIÊN TẬP:
Hai giải pháp có thể. Đầu tiên là bỏ qua fetchEvent
và chỉ sử dụng dịch vụ API trong ngOnInit
hàm.
ngOnInit() {
this._apiService.get.event(this.eventId).then(event => this.ev = event);
}
Giải pháp thứ hai. Giống như câu trả lời được đưa ra.
fetchEvent(): Promise<EventModel> {
return this._apiService.get.event(this.eventId);
}
ngOnInit() {
this.fetchEvent().then(event => this.ev = event);
}
fetchEvent
chức năng và chỉ đưaapiService.get.event
chức năng vàongOnInit
và nó hoạt động như tôi dự định. Cảm ơn! Tôi sẽ chấp nhận bạn trả lời ngay khi nó cho phép tôi quá.