2
respostas

[Sugestão] Bug no construtor

Acredito que haja um erro de lógica no algoritmo utilizado pela professora.

No código da função construtora, como ela desenvolveu, os dados dos contatos nunca serão salvos no localStorage. A função setItem() sempre recebe null.

2 respostas

Olá, Hugo.

Tudo bem?

Vamos dar uma olhada mais de perto no código para entender o que pode estar acontecendo. No construtor do ContatoService, a lógica é a seguinte:

  1. Tentar obter os contatos do localStorage.
  2. Se existirem contatos no localStorage, eles são convertidos de string para objeto e atribuídos à propriedade contatos.
  3. Se não existirem contatos no localStorage, a propriedade contatos é definida como null.
  4. Independentemente do resultado, a propriedade contatos é salva novamente no localStorage.

O problema que você mencionou parece estar relacionado ao fato de que, se contatosLocalStorage for null, a linha this.contatos = contatosLocalStorage || null; fará com que this.contatos seja null. Em seguida, localStorage.setItem('contatos', JSON.stringify(this.contatos)); salvará null no localStorage, o que não é o comportamento desejado.

Para corrigir isso, você pode inicializar a propriedade contatos com os contatos padrão se contatosLocalStorage for null. Aqui está uma versão ajustada do código:

import { Injectable } from '@angular/core';

interface Contato {
  id: number;
  nome: string;
  telefone: string;
}

@Injectable({
  providedIn: 'root'
})
export class ContatoService {
  private contatos: Contato[] = [
    { id: 1, nome: 'Ana', telefone: '29 278869420' },
    { id: 2, nome: 'Ágata', telefone: '38 128451235' },
    { id: 3, nome: 'Bruno', telefone: '95 695521583' },
    { id: 4, nome: 'Beatriz', telefone: '25 854986459' },
    { id: 5, nome: 'Carlos', telefone: '94 543197849' },
    { id: 7, nome: 'Daniel', telefone: '56 613692441' },
  ];

  constructor() {
    // Tentar obter os dados do localStorage
    const contatosLocalStorageString = localStorage.getItem('contatos');
    const contatosLocalStorage =
      contatosLocalStorageString ? JSON.parse(contatosLocalStorageString) : null;

    // Se não houver contatos no localStorage, use os contatos padrão
    this.contatos = contatosLocalStorage || this.contatos;

    // Salvar os contatos no localStorage
    localStorage.setItem('contatos', JSON.stringify(this.contatos));
  }

  obterContatos() {
    return this.contatos;
  }
}

Com essa alteração, se não houver contatos no localStorage, a propriedade contatos será inicializada com os contatos padrão e, em seguida, esses contatos serão salvos no localStorage.

Veja se é isso mesmo se faz sentido, e aplique em seu código.

Espero ter ajudado e bons estudos!

Prezado Renan, agradeço o retorno. Sugiro que inclua a sua solução no curso porque alunos iniciantes podem não ver essa solução e ficarem perdidos.