4 回答
TA贡献1784条经验 获得超8个赞
的用法console.log(this.parking)
在错误的地方。
它应该在 subscribe() 调用中向您显示this.parking
. 返回一个可观察的getParking
,所以这是一个异步调用,这意味着订阅调用中发生的任何事情都发生在 getParking API 调用完成执行之后。在 subscribe 调用之后运行的代码无需等待数据到达即可运行。
为此,您可以查看https://blog.logrocket.com/understanding-rxjs-observables/ 。
如果您使用过旧式 AJAX 调用,您将在 AJAX onreadystatechange 回调函数中编写 console.log。你可以说,这类似于 observable 的异步行为。onreadystatechange 将在状态更改时触发。同样,当 observable 接收到下一个值时,订阅会被触发。
TA贡献1798条经验 获得超3个赞
当您订阅数据所需的计算时,应在订阅函数内完成,即
ngOnInit(): void {
this._route.paramMap.subscribe(params =>{
this.id = parseInt(params.get('id'));
});
this._pds.getParking$(this.id).subscribe((parking: Parking) =>{
console.log(parking); //logs the Parking object
this.parking = parking;
console.log(this.parking) //should be here
});
console.log(this.parking) //logs UNDEFINED
}
因为订阅是异步活动,因此只有在订阅 fn 接收到 observable 发出新数据时才会执行。超出此范围的代码返回将在 javascript 主线程中按顺序执行。
TA贡献2019条经验 获得超9个赞
所以这里的问题不在我的打字稿文件中,我没有在我的 html 文件中正确调用我的对象的数据,我使用了 {{ parking.name }} 它应该是 {{ this.parking.name }}
无论如何,谢谢大家的帮助:)
TA贡献1735条经验 获得超5个赞
您console.log在 中立即执行ngOnInit()。当您订阅一个值时,订阅主体将在稍后由 observable 发出响应时执行。这应该有效:
export class ParkingdetailsComponent implements OnInit {
parking: Parking;
id: number;
constructor(
private _route: ActivatedRoute,
private _pds: ParkingDataService) { }
ngOnInit(): void {
this._route.paramMap.subscribe(params =>{
this.id = parseInt(params.get('id'));
});
this._pds.getParking$(this.id).subscribe((parking: Parking) =>{
console.log(parking); //logs the Parking object
this.parking = parking;
console.log(this.parking) //logs the Parking object
});
}
}
PS:在你的模板中也要考虑到这一点。一种解决方案是*ngIf='parking'.
添加回答
举报