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

ERROR TypeError: Cannot read properties of undefined (reading 'length')

Eu estava executando os procedimentos da aula 02 do segundo modulo e deu o seguinte erro no console do navegador: Insira aqui a descrição dessa imagem para ajudar na acessibilidade grade-fotos-animais.html:

<p class="text-center text-muted" *ngIf="!animais.length">
  Desculpe não há animais
</p>

<div class="row">
  <div class="col-4" *ngFor="let animal of animais">
    <a [routerLink]="['/animais']", animal.id></a>
    <app-cartao>
      <app-animal [url]="animal.url" [descricao]="animal.description"></app-animal>
      <i aria-hidden="true" class="fa fa-heart-o fa-1x mr-2">{{animal.likes}}</i>
      <i aria-hidden="true" class="fa fa-comment-o fa-1x mr-2 ml-2">{{animal.comments}}</i>
    </app-cartao>
  </div>
</div>

grade-fotos-animais.ts :

import { Component, Input, OnInit } from '@angular/core';
import { Animais } from '../animais';

@Component({
  selector: 'app-grade-fotos-animais',
  templateUrl: './grade-fotos-animais.component.html',
  styleUrls: ['./grade-fotos-animais.component.css'],
})
export class GradeFotosAnimaisComponent implements OnInit {
  @Input() animais!: Animais;

  constructor() {}

  ngOnInit(): void {}
}

animaisService:

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';

import { TokenService } from '../autenticacao/token.service';
import { Animais } from './animais';

const API = environment.apiURL;

@Injectable({
  providedIn: 'root',
})
export class AnimaisService {
  constructor(private http: HttpClient, private tokenService: TokenService) {}

  listaDoUsuario(nomeUsuario: string): Observable<Animais> {
    const token = this.tokenService.retornaToken();
    const headers = new HttpHeaders().append('x-acces-token', token);
    return this.http.get<Animais>(`${API}/${nomeUsuario}/photos`, {
      headers,
    });
  }
}
3 respostas
solução!

Olá Mateus, tudo bem?

Aparentemente, o erro está acontecendo porque estamos tentando acessar a propriedade length do array animais, que não foi inicializado.

Vamos tentar o seguinte:

No seu arquivo grade-fotos-animais.component.ts, modifique o @Input para ficar assim:


@Input() animais: Animais = [];

Acredito não estar relacionado a este erro, mas, no arquivo grade-fotos-animais.component.html, animal.id deve ficar dentro do array. Então, a linha que está assim:


<a [routerLink]="['/animais']", animal.id></a>

deve ficar assim:


<a [routerLink]="['/animais', animal.id]"></a>

Espero ter ajudado, bons estudos!

Mateus e Nayanne, boa tarde. Tentei a solução passada pela Nayanne,

@Input() animais: Animais = [];

mas para mim continuou apresentando a mensagem de erro para a propriedade length na página. Consegui arrumar colocando o simbolo de "safe" para a variável animais na página.

<p class="text-center text-muted" *ngIf="!animais?.length">

Boa Felipe,

Obrigada por compartilhar sua solução!

O safe navigation operator ( ? ) - operador de navegação segura - é uma estratégia muito interessante para prevenirmos esse tipo de erro quando tentamos acessar atributos de objetos com valores null ou undefined.

Você pode ler mais sobre esse e outros operadores aqui.

Bons estudos!