Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Minha tabela parou de funcionar

Olá, estou tendo muita dificuldade em seguir o curso, visto que é o primeiro da serie.

Meu componente extrato parou de montar a tabela. Tentei seguir outras duvidas aqui do forum em vão, nenhuma me ajudou e algumas quebraram ainda mais o codigo de maneira que eu nao consigo nem ter ideia do que pode estar errado.

Segue meu codigo: extrato.component.html

<table class="tabela">
  <thead class="tabela__cabecalho">
    <th class="tabela__cabecalho__conteudo">Data</th>
    <th class="tabela__cabecalho__conteudo">Valor</th>
    <th class="tabela__cabecalho__conteudo">Destino</th>
  </thead>
  <!-- <tbody *ngIf="transferencias?.length > 0; else listaVazia"> -->
  <tbody *ngIf="!!transferencias; else listaVazia">
  <!--<tbody *ngIf="transferencias$ | async as transferencias; else listaVazia">-->
    <tr class="tabela__linha" *ngFor="let transferencia of transferencias">
      <td class="tabela__conteudo">{{transferencia.data | date:"short"}}</td>
      <td class="tabela__conteudo">{{transferencia.valor | currency}}</td>
      <td class="tabela__conteudo">{{transferencia.destino}}</td>
    </tr>
  </tbody>
</table>

<ng-template #listaVazia >
 <p>Nenhuma operação cadastrada</p>
</ng-template>

nota1*: a linha <tbody *ngIf="transferencias?.length > 0; else listaVazia"> esta comentada pois desde esta aula eu nao consegui fazer a mensagem de operação cadastrada aparecer, no matter what nota2: a linha esta comentada tbm, peguei aqui do forum uma sugestao de algum instrutor e nao funcionou tbm, ele diz que nao existe 'transferencias$' , precisamente: Property 'transferencias$' does not exist on type 'ExtratoComponent'. Did you mean 'transferencias'?ngtsc(2551) extrato.component.ts

import { Component, Input, OnInit } from '@angular/core';
import { Transferencia } from '../models/transferencia.model';
import { TransferenciaService } from '../services/transferencia.service';

@Component({
  selector: 'app-extrato',
  templateUrl: './extrato.component.html',
  styleUrls: ['./extrato.component.scss']
})
export class ExtratoComponent implements OnInit {

  transferencias: any[] = [];

  constructor(private service: TransferenciaService) { }

  ngOnInit(): void {
    this.service.todas().subscribe((transferencias: Transferencia[]) => {
      console.table(transferencias);
      this.transferencias = transferencias;
    })
  }

}

transferencia.service.ts

import { Transferencia } from './../models/transferencia.model';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';


@Injectable({
  providedIn: 'root'
})

export class TransferenciaService {

  private listaTransferencia: any[] = [];
  private url!: 'http://http://localhost:3000/transferencias';

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

get transferencias () {
  return this.listaTransferencia;
}

todas():Observable<Transferencia[]> {
  return this.httpClient.get<Transferencia[]>(this.url);
}

adicionar(transferencia: any){
  this.hidratar(transferencia);
  this.listaTransferencia.push(transferencia);
}

private hidratar(transferencia: any) {
  transferencia.data = new Date();
}

}

nota3: na linha 'private url!: 'http://http://localhost:3000/transferencias';' tive que colocar o url!(com a exclamação, senão nao compilava devido ao erro de "Property 'url' has no initializer and is not definitely assigned in the constructor."

transferencia.model.ts

export interface Transferencia {
    id?: number | string;
    valor: number;
    destino: string;
    data?: Date;
}

Eu imagino que o elemento nao esta sendo construidi por alguma falha de comunicação, nao deve estar recebendo os parametros direito. Alguma ideia pessoal?

8 respostas

Boa noite Marcus! Tenta colocar a url como 'http://localhost:3000/transferencias';

no seu código está duplicado o http:// e com um ; dentro das

Ola Lilian, nao havia me atentado ao endereço com duplo https. Apesar disso nao funcionou. o ';' dentre das ? acho q vc nao terminou a frase xD

COmo da pra ver, ele confirma a solicitaçao mas nao monta o componente

Esta é a tela na parte de network

Pelo console parece que está chamando certinho o localhost, vc viu se está rodando certinho o servidor do json-server e se o db.json está configurado lá? Ali ele aponta o código 304 que é quando não tem alterações na página de request, vc pode postar o que está retornando da chamada ao localhost? só clicar nela e printar o response!

Se tiver vindo resultado no request, remove o ngIf como um todo e veja se aparece, se aparecer o problema é seu ngIf, o correto é usar a primeira opção que está comentada mas por algum motivo pode não estar funcionando pra vc.

dá uma olhada nesses dois casos e posta aqui o resultado pra ver se consigo te ajudar melhor?

o servidor do json-server que vc diz é o localhost3000/transferencias? aquele que tem que subir com o comando json-server --watch db.json? Sim subi e esta funcionando normal.

Quando clico na chamada do local Host aparece pra mim o seguinte(na aba response):

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Bytebank</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="stylesheet" href="styles.css"></head>
<body>
  <app-root></app-root>
<script src="runtime.js" type="module"></script><script src="polyfills.js" type="module"></script><script src="styles.js" defer></script><script src="vendor.js" type="module"></script><script src="main.js" type="module"></script></body>
</html>

Segue imagem: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Quanto ao ngIf, eu realmente nao sei o que esta acontecendo: na primeira linha ali com a propriedade length ele acusa que transferencias esta como undefined. mas quando eu defino ela, como por ex:

transferencias?: any[]  

ou

transferencias: any[]  | undefined;

Tambem nao funciona. E na outra linha, com

<tbody *ngIf="transferencias$ | async as transferencias; else listaVazia">

Ele tambem nao consegue entender.

O engraçado é que quando o ngOnInit estava antes, estava funcionando (isto no arquimo extrato.component.ts)

  ngOnInit(): void {
    this.transferencias = this.service.transferencias;
  }

Foi mudar para a mais complexa que parou:

  ngOnInit(): void {
    this.service.todas().subscribe((transferencias: Transferencia[]) => {
      console.table(transferencias);
      this.transferencias = transferencias;
    })
  }
solução!

Uma semana com dúvidas (obrigado time de instrutores da Alura e professor), e eu consegui finalmente encontrar o erro:

Devido o comentario da colega Lilian, resolvi investigar e percebi que meu get nao estava fazendo a requisição no LocalHost. Averiguando mais a fundo, vi que ao declarar a URL, presicei colocar o tipo string na frente do endereço, e a requisição foi realizada.

arquivo transferencia.service.ts antes:

export class TransferenciaService {

  private listaTransferencia: any[] = [];
  private url!: 'http://http://localhost:3000/transferencias';

arquivo transferencia.service.ts depois:

export class TransferenciaService {

  private listaTransferencia: any[] = [];
  private url: string = 'http://localhost:3000/transferencias';

Ps: Professores, instrutores e time da Alura, porfavor deem uma atençao neste curso, um curso introdutório, gerando uma quantidade significante de insatisfação , muitas duvidas sem resposta ... Assim,esta nao foi minha primeira duvida neste curso, estou demorando demais pra seguir as aulas pois cerca de 70% que o professor fala na aula eu preciso parar , procurar na documentação, me virar com foruns online pois aqui nao estou obtendo suporte e meus resultados nunca são os mesmos das aulas ... Normal na vida de programador eu sei, nada fora do normal (afinal a documentação sempre foi e sempre será nossa maior aliada :D), mas uma semana o aluno com duvida eh complicado, e nem ao menos uma interação com instrutores e professores, nem sei se lerão este tópico mas enfim ... comecei outros cursos gratuitos (vide Loiane Grooner) pois a didática esta muito melhor. Vamos melhorar hein Alura, adoro a plataforma de vocês, e nao vou desistir nos desafios que me são impostos, mas temos que nos atentar à qualidade do que está sendo oferecido aqui. Tomem isto como um feedback construtivo. Boa semana.