Переменная не отображается в журнале консоли за пределами функции в angular

Я пытаюсь использовать переменную в другой функции для создания маркера карты с помощью angular. я получил данные, которые будут храниться в функции и отображаться на консоли в одной функции, однако при использовании данных в другой функции это не работает:

компонент.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.info(
      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.info(daFormFac, 'response of form');
        this.latitude =  daFormFac['latitude'];
        this.longitude = daFormFac['longitude'];

        console.info(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 &copy; <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.info(this.latitude, this.longitude, "in marker")
    //10.1896062, -61.5282025
    //this.latitude, this.longitude
  }
}

Услуга:

getOneDAFacForm(id: string) {
    return this.http.get<any>("http://localhost:3000/DAFacility/"+id)
    .pipe(map((res:any)=>{
      return res;
    }))
  }

Эта функция получает ввод данных и сохраняет 2 переменные широту и долготу:

this.daformfacservice
          .getOneDAFacForm(this.getparamformid)
          .subscribe((daFormFac: DAFormFac) => {
            this.daformfacs = daFormFac;
            console.info(daFormFac, 'response of form');
            this.latitude =  daFormFac['latitude'];
            this.longitude = daFormFac['longitude'];
    
            console.info(this.latitude, this.longitude, "cords")
          });

и это приводит к

Переменная не отображается в журнале консоли за пределами функции в angular

однако при попытке доступа к данным вне функции консоль пуста.

var marker = L.marker([this.latitude, this.longitude]).addTo(map);
console.info(this.latitude, this.longitude, "in marker")

Он не отображается и недоступен. что я должен делать?

Отвечает ли это на ваш вопрос? Как вернуть ответ на асинхронный вызов

Vikas 21.03.2022 05:05
stackoverflow.com/questions/43055706/…
Vikas 21.03.2022 05:06

Я не уверен, применимо ли это, я уже получил данные в переменные, но использовать их вне функции, но в том же компоненте

user18451207 21.03.2022 05:27

@ user18451207, не могли бы вы обновить весь класс вместо указанного выше. Может поможет решить.

Arunkumar Ramasamy 21.03.2022 05:34

Просто добавил весь component.ts и сервисную функцию. @АрункумарРамасами

user18451207 21.03.2022 05:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы вызываете переменные this.latitude и this.longitude до того, как вызов API вернет данные. Пожалуйста, попробуйте ниже

 this.daformfacservice
  .getOneDAFacForm(this.getparamformid)
  .subscribe((daFormFac: DAFormFac) => {
    this.daformfacs = daFormFac;
    console.info(daFormFac, 'response of form');
    this.latitude =  daFormFac['latitude'];
    this.longitude = daFormFac['longitude'];
    console.info(this.latitude, this.longitude, "cords")
    addMarker(); // called marker for map position
  });

Здесь я вызвал addMarker после успешного вызова API.

addMarker() {
  var marker = L.marker([this.latitude, this.longitude]).addTo(map);
  console.info(this.latitude, this.longitude, "in marker");
}

я добавляю addMarker() вне компонента, то есть export class DaformFacViewFullComponent implements OnInit {}addMarker(){} или внутри функции ngOnInit

user18451207 21.03.2022 06:00

вы можете добавить метод addMarker в класс, а не в метод ngOnInit.

Arunkumar Ramasamy 21.03.2022 07:34

Ваша функция getOneDAFacForm будет выполняться асинхронно, что означает, что вы пытаетесь получить доступ к переменным (this.latitude, this.longitude) до того, как она будет инициализирована.

Эта строка console.info(this.latitude, this.longitude, "in marker") вне функции будет выполнена перед этими строками

this.latitude =  daFormFac['latitude'];
this.longitude = daFormFac['longitude'];
 
   

Другие вопросы по теме