2017-07-12 48 views
0

我正在嘗試使用http get讀取json文件,但是我收到了以下錯誤。Angular2:使用http讀取JSON文件獲取

Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

請幫我什麼是錯的。

import { Component } from '@angular/core'; 
import { Observable } from 'rxjs/Rx'; 
import { Http, Headers, RequestOptions, Response } from '@angular/http'; 

import { peopleService } from './PeopleService'; 


@Component({ 
selector: 'my-app', 
templateUrl: './app.component.html', 
//providers: [peopleService] 
}) 

export class AppComponent { 
//jsonFile: string = './EmployeeHeader.json'; 
empdata: Observable<Array<any>>[]; 

constructor(private http: Http) { 
    this.http.get('../assets/EmployeeHeader.json') 
     .map(Response => Response.json()) 
     .subscribe(empdata => this.empdata = empdata, error => console.log(error)); 
    //this.empdata = service.getPeople(); 
    //console.log('Data is: ' + this.empdata); 
} 
} 

添加如下,以供參考HTML部分,

<tbody> 
<tr *ngFor="let t of empdata"> 
<td>{{t.wwid}}</td> 
<td>{{t.name}}</td> 
<td></td> 
<td></td> 
<td></td> 
<td>{{t.idsid}}</td> 
<td></td> 
</tr> 
</tbody> 

folder structure

供大家參考代碼

JSON格式,我不知道是否與此

{ 
"Employee": 
[ 
    { 
    "name": "Karthik Shekhar", 
    "wwid": "11597210", 
    "idsid": "kshekh1x", 
    "costCenterCode": "80790", 
    "mgrWWID": "10693268", 
    "orgUnit": "67926" 
    }, 
    { 
    "name": "Aneesur Rahman", 
    "wwid": "11744439", 
    "idsid": "aneesurx", 
    "costCenterCode": "32406", 
    "mgrWWID": "10693268", 
    "orgUnit": "67926" 
    }, 
    { 
    "name": "Ashutosh Pandey", 
    "wwid": "11691980", 
    "idsid": "ashuto3x", 
    "costCenterCode": "32406", 
    "mgrWWID": "10693268", 
    "orgUnit": "67926" 
    }, 
] 
} 
任何問題
+0

如何實現* ngfor在你的html部分? – amin89

+0

這是因爲'ngFor'綁定到數組而不是對象。解決方法之一可以是:'this.empdata = [empdata]'。但是,可以有更好的解決方案比這個更好。此外,如果你可以分享你從API和你的html'ngFor'結構得到的迴應? –

+0

你能分享你的文件夾結構嗎?我認爲你的HTTP GET請求執行404和* NGFor沒有收到預期的數組,因此它會拋出錯誤 –

回答

2

您的empdata是一個對象,而不是一個數組。您需要訪問Employee財產在你的對象:

constructor(private http: Http) { 
    this.http.get('../assets/EmployeeHeader.json') 
     .map(Response => Response.json()) 
     .subscribe(empdata => { 
      //access Employee property 
      this.empdata = empdata.Employee 
     }, error => console.log(error)); 
} 
+0

任何想法如何讓這個json數據綁定到自動完成輸入字段的基礎上下拉。例如,如果我在下拉列表中選擇_name_,它應該顯示所有Employee.name值。 _wwid_應顯示所有Employee.wwid值等。 – Aneez

0

改變您的服務像下面

this.http.get('../assets/EmployeeHeader.json') 
      .map(Response => Response.json()) 
      .subscribe(empdata => {this.empdata = empdata.Employee} 
    , error => console.log(error)); 

或 變化* ngFor到

<tbody> 
<tr *ngFor="let t of empdata.Employee"> 
<td>{{t.wwid}}</td> 
<td>{{t.name}}</td> 
<td></td> 
<td></td> 
<td></td> 
<td>{{t.idsid}}</td> 
<td></td> 
</tr> 
</tbody> 
+1

在html中,不需要對Employee的引用,因爲您已在subscribe調用中指定了該引用。 –

+0

如果它沒有分配,那麼它是需要的,這就是爲什麼我提到或在我的答案 –

+0

噢好吧。我認爲html是繼續添加的。 –