Angular2 輸入與非同步資料
有時你需要非同步獲取資料,然後再將其傳遞給要使用的子元件。如果子元件在收到資料之前嘗試使用該資料,則會引發錯誤。你可以使用 ngOnChanges
來檢測元件’@Input
s 中的更改,並等到它們被定義後再對其進行操作。
父元件,對端點進行非同步呼叫
import { Component, OnChanges, OnInit } from '@angular/core';
import { Http, Response } from '@angular/http';
import { ChildComponent } from './child.component';
@Component ({
selector : 'parent-component',
template : `
<child-component [data]="asyncData"></child-component>
`
})
export class ParentComponent {
asyncData : any;
constructor(
private _http : Http
){}
ngOnInit () {
this._http.get('some.url')
.map(this.extractData)
.subscribe(this.handleData)
.catch(this.handleError);
}
extractData (res:Response) {
let body = res.json();
return body.data || { };
}
handleData (data:any) {
this.asyncData = data;
}
handleError (error:any) {
console.error(error);
}
}
具有非同步資料作為輸入的子元件
此子元件將非同步資料作為輸入。因此,在使用之前必須等待資料存在。我們使用 ngOnChanges,它會在元件輸入發生變化時觸發,檢查資料是否存在,如果存在則使用它。請注意,如果依賴於傳入的資料的屬性不為 true,則子項的模板將不會顯示。
import { Component, OnChanges, Input } from '@angular/core';
@Component ({
selector : 'child-component',
template : `
<p *ngIf="doesDataExist">Hello child</p>
`
})
export class ChildComponent {
doesDataExist: boolean = false;
@Input('data') data : any;
// Runs whenever component @Inputs change
ngOnChanges () {
// Check if the data exists before using it
if (this.data) {
this.useData(data);
{
}
// contrived example to assign data to reliesOnData
useData (data) {
this.doesDataExist = true;
}
}