mapReady(map)
вызывается выходом, испускаемым компонентом <agm-map>
, который может быть передан до завершения завершения ngOnInit()
, поэтому вы получите undefined
для this.locations
.
Попробуйте получить ваши местоположения, когда карта будет готова, тогда вы не получите undefined
.
mapReady(map) {
this.serviceHomeScreen.getAllListingsDetails().subscribe((data) => {
this.locations = data[0];
for (let i = 0; i < this.locations.length; i++) {
console.log("aici")
return new google.maps.Marker({
position: { lat: this.locations[i].lat, lng: this.locations[i].long },
map: map,
});
}
})
}
Другой подход заключается в том, чтобы продолжить получать данные на ngOnInit
, но установить флаг, например this.dataLoaded = true
когда данные закончили загрузку.Затем вы будете использовать это свойство в *ngIf
в шаблоне компонента <agm-map>
, чтобы компонент загружался только тогда, когда данные готовы.Затем данные будут доступны, когда (mapReady) отправляется и вызывается mapReady(map)
.
dataLoaded = false;
ngOnInit() {
this.getListings()
}
getListings() {
this.serviceHomeScreen.getAllListingsDetails().subscribe((data) => {
this.extractlistings(data[0]);
})
}
extractlistings(data) {
this.locations = data;
this.dataLoaded = true;
console.log(this.locations[1]); // has the right value
}
mapReady(map) {
console.log(this.locations[1]); // now defined
for (let i = 0; i < this.locations.length; i++) {
console.log("aici")
return new google.maps.Marker({
position: { lat: this.locations[i].lat, lng: this.locations[i].long },
map: map,
});
}
}
Шаблон:
<agm-map
*ngIf="dataLoaded"
id="map_"
[zoom]="30"
[fitBounds]="true"
[latitude]="lat"
[longitude]="lng"
[streetViewControl]="false"
[zoomControl]="false"
(mapReady)="mapReady($event)">
</agm-map>