在我的Angular 2模板中未定义从http.get()加载的JSON数据

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)

这将使naamhallnull 的引用安全.

更新:

为了完整起见,我会指出你实际上也可以使用*ngIf,尽管null安全检查可以使模板更清晰.

@Component({
    template: `
  <div *ngIf="hall"> <!-- note the added *ngIf -->
    {{hall.naam}}
  </div>
  `
})
Run Code Online (Sandbox Code Playgroud)