我有以下代码:
data:IQuest[]|any=[];
ngOnInit(){
this.getData();
console.log(this.data[1].Question);
}
getData(){
let url = "http://127.0.0.1:5153/Quests";
this.http.get(url).subscribe(data=>{
this.data=data;
});
}
export interface IQuest {
Id: number,
lat: number,
lon: number,
Question:string,
}
我无法访问typescript中data属性内的值,例如,当我调用console.log时,就像上面的代码一样,我会收到如下错误:
ERROR TypeError: Cannot read properties of undefined (reading 'Question')
at AppComponent.ngOnInit (app.component.ts:32:30)
另一方面,当我想在html中显示值时,它们显示正确,访问没有问题,例如:
<div *ngFor="let element of data">
{{element.question}}
</div>
它把属性的值一个列在另一个的下面。那么为什么我不能在TypeScript中访问这些值呢?
2条答案
按热度按时间tv6aics11#
可以尝试移除数据定义中的
|any
。或者在填充时像this.data=data as IQuest[];
一样强制转换它368yc8dk2#
您的代码中存在一些问题,有些问题已经被其他人提到过。
this.data[1]
正在访问数组中的第二个元素,该元素可能与您的html不同(如果您只返回1个项目)。question
(小写q),而 typescript 访问Question
(大写Q)。1.正如@Fussel提到的,您正在异步加载数据,这意味着在您执行
console.log
时,this.data = data
可能尚未执行。请将console.log
直接移动到订阅中this.data = data
的下方。看一下你发布的另一个问题(Angular TypeScript cannot read properties of undefined error)。数字3可能是这个错误的原因,当它被修复时,数字2可能是你的下一个错误:)。调试器显示你实际上返回了一个带有
question
(小写q)变量的对象。这也意味着你的IQuest
定义是错误的(Id
属性(大写I)也是如此)。其他一些需要注意的事项包括:说
this.data
是IQuest[]
并不意味着它实际上是。如果你从HttpClient返回其他东西,那么javascript会把它放在那个变量中。另外,正如@Nando
IQuest[]|any
所提到的,这意味着变量是IQuest[]
或可能是其他任何东西。这不会解决您的问题,因为这是编译时由typescript使用的东西,您的错误是由javascript在运行时生成的,但最好更改它,并删除|any
部分。