将可观察到的JSON响应转换为角度(打字稿)对象数组

时间:2019-02-11 07:45:02

标签: django angular django-rest-framework

我有一个服务API,可从Django-REST中提取数据。返回的JSON如下:

[
{
    "manufacturer": "Mfg",
    "model": "Model",
},
{
    "manufacturer": "Mfg2",
    "model": "Model2",
}
]

服务API函数getData返回:

return this.httpClient.get(`${this.apiURL}/data/`);

请注意,我正在Django中使用ListAPIView,并且已经验证了上述URL返回了上面显示的JSON对象(尽管我必须添加?format = json才能在Django的APIView之外获取原始数据)。

然后我有一个角度组件,该组件调用服务API函数将可观察对象转换为对象数组:

export class Data implements OnInit {

private records = Array<object> = [];

...

constructor(private  apiService:  ApiService) {}

ngOnInit() {
  this.getData();
}

public getData() {
 this.apiService.getData().subscribe((data: Array<object>) => {this.records = data});

没有错误或警告,但是当我尝试访问记录数组时,在组件的HTML文件中,该文件的长度始终为0。例如,以下内容将打印“ 0”和一个空表。

<P> {{ records.length }}</P>
<table>
  <tr>
    <th>Manufacturer</th>
  </tr>
  <tr *ngFor="let record of records">
    <td> {{ record.manufacturer }} </td>
  </tr>
</table>

我想念什么?

2 个答案:

答案 0 :(得分:1)

如果使用接口定义模型,然后将该接口用作get调用的通用参数,则HttpClient将自动将响应映射到已定义的结构。

例如:

界面

export interface Product {
  manufacturer: string;
  model: string;
}

数据服务

return this.httpClient.get<Product[]>(`${this.apiURL}/data/`);

组件

private records: Product[];

public getData() {
 this.apiService.getData().subscribe((data: Product[]) => this.records = data);

模板

<div *ngIf="records">
 <p> {{ records.length }}</p>
 ...
</div>

首次出现模板时,异步数据检索过程可能尚未完成。因此,通过在页面上放置ngIf,它将不会尝试显示元素,直到检索到数据为止。

答案 1 :(得分:0)

您需要向其中添加异步管道。

<tr *ngFor="let record of records|async">
    <td> {{ record.manufacturer }} </td>
  </tr>