Kup*_*upi 7 json typescript angular
我正在尝试读取本地json文件并将其解析为我制作的具有相同属性的类.当我尝试从类中读取时,它给出了错误,表示该类为null或未定义.
我有一个hall.ts看起来像这样的文件:
import {Item} from '../item/item';
export class Hall {
constructor(public id:number,
public naam:string,
public oppervlakte:number,
public aantalItems:number,
public itemsMetNodigeActie:number,
public items:Item[]) {
}
}
Run Code Online (Sandbox Code Playgroud)
它使用item.ts:
export class Item {
constructor(public categorie:string,
public naam:string,
public productnummer:string,
public omschrijving:string,
public laatsteUitgevoerdeActie:Actie,
public eerstVolgendeActie:Actie) {
}
}
export class Actie{
constructor(datum: string,
type: string,
omschrijving: string){}
}
Run Code Online (Sandbox Code Playgroud)
hall1.json我想要读取的json文件看起来像这样:
{
"id": 1,
"naam": "hall1",
"oppervlakte": 100,
"aantalItems": 3,
"itemsMetNodigeActie": 3,
"items": [
{
"id": 1,
"categorie": "machine",
"productnummer": "ADE124e",
"omschrijving": "print papieren af",
"laatsteUitgevoerdeActie": {
"datum": "2015-01-05T00:00:00.000Z",
"type": "vervanging",
"omschrijving": "papier vervangen"
},
"eerstVolgendeActie": {
"datum": "2016-01-06T00:00:00.000Z",
"type": "vervanging",
"omschrijving": "inkt vervangen"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在使用一个hall.service.ts尝试读取本地存储的json文件,并将其返回到一个Hall对象中.这是这样做的方法:
public getHall(): Observable<Hall> {
return this.http.get('app/hall/hall1.json')
.map((res:Response) => res.json());
}
Run Code Online (Sandbox Code Playgroud)
我用这个方法 hallDetail.component.ts
export class HallDetailComponent implements OnInit{
public hall: Hall;
constructor(
private service: HallService
){}
ngOnInit(){
this.service.getHall().subscribe((hall:Hall) => {
this.hall = hall;
})
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,它并没有给我任何错误,但是当我尝试从hall对象中读取时,它是未定义的
@Component({
template: `
<div>
{{hall.naam}}
</div>
`
})
Run Code Online (Sandbox Code Playgroud)
错误:
EXCEPTION: TypeError: Cannot read property 'naam' of undefined in [
{{hall.naam}}
in HallDetailComponent@1:7]
Run Code Online (Sandbox Code Playgroud)
Mic*_*ryl 10
你必须记住这个http.get()呼叫是异步的.您的模板hall在异步http调用解析之前尝试作为对象进行处理.
这hall就是未定义的原因,因此,您无法访问它上面的任何属性(它尚不存在).
正如Eric在评论中提到的那样,为你的模板尝试这样的事情:
@Component({
template: `
<div>
{{hall?.naam}} <!-- note the added ? -->
</div>
`
})
Run Code Online (Sandbox Code Playgroud)
这将使naam对hallnull 的引用安全.
更新:
为了完整起见,我会指出你实际上也可以使用*ngIf,尽管null安全检查可以使模板更清晰.
@Component({
template: `
<div *ngIf="hall"> <!-- note the added *ngIf -->
{{hall.naam}}
</div>
`
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6257 次 |
| 最近记录: |