Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

retorno undefined de um JSON

Bom dia!

tenho um retorno de um backend que esta retornando os valores corretamente parametros.service.ts

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';
import { Parametro } from './parametro.models';

const API = environment.urlAPI;

@Injectable({
  providedIn: 'root'
})
export class ParametrosService {

  private url = `${API}/parametros`
  private listarParametros: Parametro[];

  constructor(private httpClient: HttpClient) {
    this.listarParametros = []
   }

   get parametros(){
    return this.listarParametros
   }

   listaDeParametros(): Observable<Parametro[]>{
    return this.httpClient.get<Parametro[]>(this.url)
  }
}

no console.log o retorno esta correto, porem ao tentar acessar as propriedades do objeto o retorno vem como undefined. no caso eu preciso pegar a informação da propriedade "unidade" para inserir em outro campo do formulário, e não queria fazer outra consulta ao backend so para trazer essa informação

parametro.component.html

<label class="form" for="parametro" >Parametro</label>
<select class="form-control" (change)="change($event)" name="parametros">
  <option value="0">-- Selecione --</option>
  <option *ngFor="let parametros of listarParametros" value="{{ parametros | json }}">{{ parametros.parametro }}</option>
</select>

parametros.component.ts

import { ParametrosService } from './parametros.service';
import { Component, OnInit, EventEmitter, Output } from '@angular/core';
import { Parametro } from './parametro.models'

@Component({
  selector: 'app-parametros',
  templateUrl: './parametros.component.html',
  styleUrls: ['./parametros.component.css']
})

export class ParametrosComponent implements OnInit {

  listarParametros: Parametro[] = [];
  parametros: any[];
   @Output() aoSelecionar = new EventEmitter<any>();

  constructor(private parametroService: ParametrosService) {
    this.parametros = [];
   }

  ngOnInit(): void {
    this.parametroService.listaDeParametros().subscribe(
      (parametros) => { this.listarParametros = parametros }
    );
  }

  change(e: any){
    this.aoSelecionar.emit(e.target.value)
  }

}

nova-coleta.component.html

<div class="col-md-3">
        <app-parametros (aoSelecionar)="recebeParametro($event)"></app-parametros>
      </div>

nova-coleta.component.ts

import { AnexoService } from './../services/anexos.service';

import { Component, Input, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { Anexo } from '../models/anexos.models';
import { Parametro } from '../componentes/parametros/parametro.models';
import { Local } from '../componentes/locais/local.models';

@Component({
  selector: 'app-nova-coleta',
  templateUrl: './nova-coleta.component.html',
  styleUrls: ['./nova-coleta.component.css']
})
export class NovaColetaComponent implements OnInit {

  novaColetaForm!: FormGroup;
  @Input() parametro_id!: Parametro;
  @Input() local_id!: Local[];
  msgAnexo: Anexo[] = [];
  unidadeMedida: string = '';

  constructor(
    private formBuilder: FormBuilder,
    private anexoService: AnexoService,
    private router: Router,
  ) { }

  ngOnInit(): void {
    this.novaColetaForm = this.formBuilder.group(
      {
        amostrador: [''],
        parametro_id: [''],
        local_id: [''],
        valor: [''],
        dataColeta: ['']
      }
    )
  }

  recebeParametro(parametro_id: Parametro) {
    const parametro = parametro_id;
     console.log(parametro)  
     /* retorno do console.log
     {
          "id": 2,
          "parametro": "Turbidez",
          "periodicidade": "semanal/mensal",
          "unidade": "uT",
          "createdAt": "2022-06-08T11:52:28.000Z",
          "updatedAt": "2022-06-08T11:52:28.000Z"
    }
     
     */


/*
    let parametro: Parametro = {
      id: parametro_id.id,
      parametro: parametro_id.parametro,
      periodicidade: parametro_id.periodicidade,
      unidade: parametro_id.unidade,
      createdAt: parametro_id.createdAt,
      updatedAt: parametro_id.updatedAt

    }
    console.log(parametro);
    retorno do console.log // undefined
    
    */
  }

  recebeLocal(local_id: Array<Local>){
    this.local_id = local_id;
    console.log('local_id: ',this.local_id);
  }

  carregaAnexo(parametro_id: number, local_id: number){
    this.anexoService.listaDeAnexo(parametro_id, local_id).subscribe(
      (anexo: Anexo[]) => { this.msgAnexo = anexo}
    );
    console.log(this.msgAnexo);
  }

  submit(){

    this.novaColetaForm.value.parametro_id = this.parametro_id;
    this.novaColetaForm.value.local_id = this.local_id;

    console.log(this.novaColetaForm.value);
  }

}
1 resposta
solução!

Oi Alexandre, tudo bem?

Com base nas informações que você forneceu, vou tentar te ajudar a encontrar uma solução para esse problema.

Identifiquei algumas possíveis razões pelas quais você está recebendo undefined ao tentar acessar as propriedades do objeto JSON. Vou fornecer algumas sugestões para você investigar e corrigir o problema.

  1. Verifique se a solicitação HTTP está sendo feita corretamente: No seu serviço ParametrosService, você está usando o método httpClient.get() para fazer uma solicitação HTTP GET para obter os parâmetros. Verifique se a solicitação está sendo enviada corretamente para o backend e se a resposta está retornando os dados esperados. Você pode fazer isso usando a ferramenta de desenvolvedor do navegador para inspecionar a solicitação e a resposta.

  2. Certifique-se de que a resposta do backend corresponda à estrutura do modelo: Ao receber a resposta do backend, verifique se ela corresponde à estrutura definida em seu modelo Parametro. O Angular espera que os dados recebidos tenham a mesma estrutura que o modelo especificado. Se houver alguma diferença, as propriedades do objeto podem ser undefined. Certifique-se de que as propriedades id, parametro, periodicidade, unidade, createdAt e updatedAt estejam presentes na resposta do backend.

  3. Confirme se a lista de parâmetros está sendo populada corretamente: No seu componente ParametrosComponent, você está atribuindo a resposta recebida do serviço à propriedade listarParametros. Verifique se a lista está sendo populada corretamente após a solicitação HTTP. Você pode adicionar um console.log(this.listarParametros) logo após a atribuição para verificar se os dados foram obtidos corretamente.

  4. Verifique se o evento de seleção está sendo tratado corretamente: No seu componente NovaColetaComponent, você está recebendo o evento de seleção através do método recebeParametro. Verifique se o evento está sendo acionado corretamente e se o valor está sendo atribuído à propriedade parametro_id. Você pode adicionar um console.log(parametro_id) no início do método para verificar se o valor está chegando corretamente.

Espero que tenha te ajudado.

Um abraço e bons estudos.