use*_*483 2 django django-rest-framework angular
我有一个从 Django-REST 提取数据的服务 API。返回的 JSON 如下所示:
[
{
"manufacturer": "Mfg",
"model": "Model",
},
{
"manufacturer": "Mfg2",
"model": "Model2",
}
]
Run Code Online (Sandbox Code Playgroud)
服务API函数getData返回:
return this.httpClient.get(`${this.apiURL}/data/`);
Run Code Online (Sandbox Code Playgroud)
请注意,我在 Django 中使用 ListAPIView,并且我已验证上述 URL 返回上面显示的 JSON 对象(尽管我必须添加 ?format=json 才能获取 Django APIView 之外的原始数据)。
然后,我有一个 Angular 组件,它调用服务 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});
Run Code Online (Sandbox Code Playgroud)
没有错误或警告,但在组件的 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>
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
如果您使用接口定义模型,然后使用该接口作为 get 调用的通用参数,则 HttpClient 将自动将响应映射到定义的结构。
例如:
界面
export interface Product {
manufacturer: string;
model: string;
}
Run Code Online (Sandbox Code Playgroud)
数据服务
return this.httpClient.get<Product[]>(`${this.apiURL}/data/`);
Run Code Online (Sandbox Code Playgroud)
成分
private records: Product[];
public getData() {
this.apiService.getData().subscribe((data: Product[]) => this.records = data);
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果你想在上面添加console.log,你需要像这样添加:
public getData() {
this.apiService.getData().subscribe((data: Product[]) => {
this.records = data;
console.log(this.records);
);
}
Run Code Online (Sandbox Code Playgroud)
模板
<div *ngIf="records">
<p> {{ records.length }}</p>
...
</div>
Run Code Online (Sandbox Code Playgroud)
当模板首次出现时,异步数据检索过程可能尚未完成。因此,通过在ngIf页面周围放置一个,在检索数据之前它不会尝试显示元素。
| 归档时间: |
|
| 查看次数: |
10539 次 |
| 最近记录: |