【发布时间】:2019-02-21 10:38:22
【问题描述】:
我正在尝试使用Angular 6 将一些数据绑定到模板,所以这是ngOnInit:
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
this.id = +params['id'];
});
let url = this.baseUrl + `/items/${this.id}`;
this.httpClient.get(url).subscribe((data : Array<any>)=> {
this.ItemToEdit = data;
});
}
这是模板:
<div *ngFor="let item of ItemToEdit?.results">
<div class="col-sm-8 float-left">
<mat-form-field> <input matInput
class="form-control" placeholder="Item name"
formControlName="name" id="ItemName" value='{{ item.name }}'>
</mat-form-field>
</div>
</div>
变量ItemToEdit如下:
{
"results": [
{
"alias": [
"first"
],
"apps": [],
"description": "this is an item",
"id": 1,
"name": "item342"
}
]
}
所以,问题是当我打开模板(通过某个按钮)时,没有显示具有 ngFor 指令的 HTML(具有 ngFor 的 div 变为空白)。我不知道如何显示数据...变量ItemToEdit 只有一个值(长度= 1),但由于它有一个名为results 的嵌套数组,我通过for 循环显示数据。当我尝试在打字稿中做这样的事情时:
this.loadedName = this.ItemToEdit.results[0].name;
我收到一条错误消息,提示 ItemToEdit.results 未定义
有什么想法吗?
编辑
发现我的代码有效,但只有在刷新页面后...
服务器间歇性地返回这样的响应而不是预期的结果:
{ "error": "(_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away') [SQL: 'SELECT .... }{ "error": "(_mysql_exceptions.ProgrammingError) (2014, \"Commands out of sync; you can't run this command now\") [SQL: 'SELECT ......" }
================ 编辑 2 ===============
我得到了 Mysql 异常,因为我在 ngOnInit 中创建了另一个 httpRequest 来填充数据库中的选择字段...。 删除该请求后,我的代码工作正常。
【问题讨论】:
-
嗯,由于
this.ItemToEdit = data执行得稍晚一点,能否请您添加一个isLoading = false,在`this.ItemToEdit = data` 之后将其设置为true,并添加一个带有ngIf 的div在 ngFor 之外? -
可能在调用
httpClient时url的值不正确。尝试在route.params.subscribe回调中移动ngOnInit的最后两条语句。 -
@ConnorsFan 没用
-
在您订阅 httpClient 时,您将数据定义为
Array<any>。这和this.ItemToEdit = data;行使ItemToEdit?.results的访问无效,因为ItemToEdit本身就是一个数组。如果您发现 itemToEdit 只有一个元素(这就是您要查找的内容),请在模板中更改对ItemToEdit[0].results的访问权限,在打字稿代码中更改对ItemToEdit[0].results[0].name的访问权限。 -
只需将 html
let item of ItemToEdit?.results替换为let item of ItemToEdit。并将 tsthis.ItemToEdit = data;替换为this.ItemToEdit = data ? data.results : []