在 ngAfterViewInit 中等待 NgOnInit 完成
Wait for NgOnInit to complete inside ngAfterViewInit
我正在 ngOnInit 中加载一些数据,我需要在 ngAfterViewInit 中访问这些数据。具体来说,Google 地图 API,我从数据库中加载 GPS 坐标,然后我需要在创建地图时将它们添加到地图中。我正在 ngAfterViewInit 中创建地图本身。
我想我可以把整个事情都移到 AfterViewInit,但我想我会问是否有一个好的方法来等待 ngOnInit 完成,然后再使用 AfterViewInit 中的数据,以防我将来需要它其他项目。
ngOnInit() {
this.loadGpsCoordinates();
}
ngAfterViewInit() {
var elem = document.getElementById('map');
if (elem != null) {
this.map = new google.maps.Map(elem, {
center: { lat: -32.3881373, lng: 55.4343223 },
zoom: 17,
disableDefaultUI: true
});
// Now loop through GPSCoordinates to add Markers
// But wait! What if the coords aren't loaded yet?!
...
}
我假设 this.loadGpsCoordinates();
returns 是一个 Observable(如果不是,也可以这样做)
private coordinatesSubject = new ReplaySubject<any>(1)
ngOnInit() {
this.loadGpsCoordinates().pipe(
tap( data => this.coordinatesSubject.next(data))
).subscribe()
}
private ngAfterViewInit(data) {
this.coordinatesSubject().subscribe( data => {
// data would be use below
var elem = document.getElementById('map');
if (elem != null) {
this.map = new google.maps.Map(elem, {
center: { lat: -32.3881373, lng: 55.4343223 },
zoom: 17,
disableDefaultUI: true
});
}
})
}
注意:我没有添加 takeUntil(destroyed$)
但您可以单独查找 - 它用于在删除组件时退订服务
我正在 ngOnInit 中加载一些数据,我需要在 ngAfterViewInit 中访问这些数据。具体来说,Google 地图 API,我从数据库中加载 GPS 坐标,然后我需要在创建地图时将它们添加到地图中。我正在 ngAfterViewInit 中创建地图本身。
我想我可以把整个事情都移到 AfterViewInit,但我想我会问是否有一个好的方法来等待 ngOnInit 完成,然后再使用 AfterViewInit 中的数据,以防我将来需要它其他项目。
ngOnInit() {
this.loadGpsCoordinates();
}
ngAfterViewInit() {
var elem = document.getElementById('map');
if (elem != null) {
this.map = new google.maps.Map(elem, {
center: { lat: -32.3881373, lng: 55.4343223 },
zoom: 17,
disableDefaultUI: true
});
// Now loop through GPSCoordinates to add Markers
// But wait! What if the coords aren't loaded yet?!
...
}
我假设 this.loadGpsCoordinates();
returns 是一个 Observable(如果不是,也可以这样做)
private coordinatesSubject = new ReplaySubject<any>(1)
ngOnInit() {
this.loadGpsCoordinates().pipe(
tap( data => this.coordinatesSubject.next(data))
).subscribe()
}
private ngAfterViewInit(data) {
this.coordinatesSubject().subscribe( data => {
// data would be use below
var elem = document.getElementById('map');
if (elem != null) {
this.map = new google.maps.Map(elem, {
center: { lat: -32.3881373, lng: 55.4343223 },
zoom: 17,
disableDefaultUI: true
});
}
})
}
注意:我没有添加 takeUntil(destroyed$)
但您可以单独查找 - 它用于在删除组件时退订服务