I am trying to use a variable in another function to create a map marker using angular. i got the data to be stored in the function and display on the console within one function however when using the data in another function it does not work:
component.ts:
import { HttpClient } from '@angular/common/http';
import { Component, OnInit, AfterViewInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { DAFormFac } from 'src/app/models/daformfac.interface';
import { DaformfacserviceService } from 'src/app/service/daformfacservice.service';
declare const L: any;
import { MocMapService } from 'src/app/service/moc-map.service';
import { map as MapData } from 'rxjs';
@Component({
selector: 'app-daform-fac-view-full',
templateUrl: './daform-fac-view-full.component.html',
styleUrls: ['./daform-fac-view-full.component.css'],
})
export class DaformFacViewFullComponent implements OnInit {
daformfac: DAFormFac[] = [];
formID: string;
getparamformid: any;
daformfacs: any;
latitude: any;
longitude: any;
private map: L.Map;
constructor(
private daformfacservice: DaformfacserviceService,
private route: ActivatedRoute,
private mapService: MocMapService,
private http: HttpClient,
) {}
ngOnInit(): void {
console.log(
this.route.snapshot.paramMap.get('facviewid'),
' : ID of report'
);
this.getparamformid = this.route.snapshot.paramMap.get('facviewid');
this.daformfacservice
.getOneDAFacForm(this.getparamformid)
.subscribe((daFormFac: DAFormFac) => {
this.daformfacs = daFormFac;
console.log(daFormFac, 'response of form');
this.latitude = daFormFac['latitude'];
this.longitude = daFormFac['longitude'];
console.log(this.latitude, this.longitude, "cords")
});
let map = L.map('map').setView([10.536421, -61.311951], 8);
L.tileLayer(
'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}',
{
attribution:
'Map data © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
id: 'mapbox/streets-v11',
tileSize: 512,
zoomOffset: -1,
accessToken:
'pk.eyJ1IjoiZGlsbG9uciIsImEiOiJjbDB6MGdlbW8xNnZuM2lqbmJnNWZkNzY0In0.cfAOIAy5foQsoUlHhpYSjQ',
}
).addTo(map);
var marker = L.marker([this.latitude, this.longitude]).addTo(map);
console.log(this.latitude, this.longitude, "in marker")
//10.1896062, -61.5282025
//this.latitude, this.longitude
}
}
Service:
getOneDAFacForm(id: string) {
return this.http.get<any>("http://localhost:3000/DAFacility/" id)
.pipe(map((res:any)=>{
return res;
}))
}
This function gets the data entry and stored 2 variables latitude and longitude:
this.daformfacservice
.getOneDAFacForm(this.getparamformid)
.subscribe((daFormFac: DAFormFac) => {
this.daformfacs = daFormFac;
console.log(daFormFac, 'response of form');
this.latitude = daFormFac['latitude'];
this.longitude = daFormFac['longitude'];
console.log(this.latitude, this.longitude, "cords")
});
and it results in
however when trying to access the data outside the function the console is blank.
var marker = L.marker([this.latitude, this.longitude]).addTo(map);
console.log(this.latitude, this.longitude, "in marker")
It does not display and is not accessible. what should i do?
CodePudding user response:
You are calling the this.latitude
and this.longitude
variables before the api call return the data. Please try with below
this.daformfacservice
.getOneDAFacForm(this.getparamformid)
.subscribe((daFormFac: DAFormFac) => {
this.daformfacs = daFormFac;
console.log(daFormFac, 'response of form');
this.latitude = daFormFac['latitude'];
this.longitude = daFormFac['longitude'];
console.log(this.latitude, this.longitude, "cords")
addMarker(); // called marker for map position
});
Here I called addMarker after the api call success.
addMarker() {
var marker = L.marker([this.latitude, this.longitude]).addTo(map);
console.log(this.latitude, this.longitude, "in marker");
}
CodePudding user response:
Your function getOneDAFacForm will be executed asynchronously, which means you are trying to access the variables ( this.latitude, this.longitude ) before it is initialized.
This line console.log(this.latitude, this.longitude, "in marker")
outside the function will be executed before these lines
this.latitude = daFormFac['latitude'];
this.longitude = daFormFac['longitude'];