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

[Dúvida] Apresentação de dados na tela

Faaaala galera, beleza !!

Então, estou fazendo o curso e o projeto e muito massa, mas fiquei com uma dúvida básica aqui, quando eu removo minha lista mocada e passa a gravar os meus dados na localStorage, mas informações a baixo do produto não aparecem completas, só está aparecendo a data e não a data e hora. Vou deixar aqui o código do HTML e do componente da classe item.

HTML

<input
  class="checkbox"
  type="checkbox"
  name="comprado"
  id="comprado"
  [checked]="item.comprado"
  (change)="checarItem"
  >
<p class="description" [class.line-through]>{{item.nome}} </p>
<div class="d-contents" *ngIf="!item.comprado">
  <fa-icon class="delete-icon" [icon]="faTrash" (click)="deletarItem()" ></fa-icon>
  <fa-icon class="edit-icon" (click)="editarItem()" [icon]="faPen" ></fa-icon>
</div>
<small class="date">{{item.data}}</small>

COMPONENT

import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output } from '@angular/core';
import { faPen, faTrash } from '@fortawesome/free-solid-svg-icons';
import { Item } from 'src/app/interfaces/iItem';


@Component({
  selector: 'app-item',
  templateUrl: './item.component.html',
  styleUrls: ['./item.component.css']
})
export class ItemComponent implements OnInit, OnChanges, OnDestroy {

  @Input() item! : Item;
  @Output() emitindoItemParaEditar = new EventEmitter();
  @Output() emitindoIdParaDeletar = new EventEmitter();

  faPen = faPen;
  faTrash = faTrash

  constructor() { }

  ngOnInit(): void {

   }

  ngOnChanges() {

  }

  editarItem(){
    this.emitindoItemParaEditar.emit(this.item);
  }

  deletarItem(){
    this.emitindoIdParaDeletar.emit(this.item.id);
    console.log('Estão tentando me deletar')
  }

  checarItem(){
    if(this.item.comprado === true){
      this.item.comprado = false;
    }else{
      this.item.comprado = true
    }
  }

  ngOnDestroy(){
    console.log('Conseguiram me deletar')
  }

}
6 respostas

Olá Renato, tudo bom?

Para capturar a data e hora que o item é adicionado, eu crio o seguinte método dentro do Service:

criarItem(nomeDoItem: string){
    const id = this.listaDeCompra.length + 1
    const item : Item = {
      id: id,
      nome: nomeDoItem,
      data: new Date().toLocaleString('pt-BR'),
      comprado: false
    }
    return item
  }

Dessa forma eu consigo ter esses dados de acordo com o formato brasileiro. Ah, importante saber que a informação de data mockada está com um formato diferente de escrita pois foram escritas na mão, já com o método .toLocaleString('pt-BR') é escrito de forma crua, a data e hora sem o o dia da semana.

Visualiza o fluxo de criação dos itens, passando pela chamada do método de criação que chama o método dentro do Service (o método criarItem citado acima),

Input.component.ts

adicionarItem(){
    this.listaService.adicionarItemNaLista(this.valorItem);
    this.limparCampo();
}

já dentro do service, verifica se este novo item foi adicionado no Array presente no Service. lista-de-compra.service.ts

adicionarItemNaLista(nomeDoItem: string){
    const item = this.criarItem(nomeDoItem)
    this.listaDeCompra.push(item);
    // this.atualizarLocalStorage();
}

Em seguida verifca se no constructor é feito um get dos itens do LocalStorage.

 constructor() {
    this.listaDeCompra = JSON.parse(localStorage.getItem('itens')|| '[]');
  }

E por fiz se quando os itens são editados, excluidos ou quando acontece alguma alteração no app.component.ts, ele chama o ngDoCheck que chama o método que atualiza as informaçõs dentro do LocalStorage: lista-de-compra.service.ts

  atualizarLocalStorage(){
    localStorage.setItem('itens', JSON.stringify(this.listaDeCompra));
  }

app.component.ts


  ngDoCheck(){
    this.listaService.atualizarLocalStorage();
  }

Espero ter ajudado, abraço.

Fala Diego, beleza irmão ! Cara a sua explicação foi perfeita, mas, ainda, não tirou a minha dúvida. Eu conferi no meu projeto com todos os códigos que você colocou aqui e está tudo batendo certinho, mas quando vou incluir um novo produto, só vem a data e a hora não é carregada. Vou colocar uma imagem para ficar mais claro !

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

Então Renato, você poderia compartilhar seu projeto comigo para que eu possa entender melhor o que está rolando?

Fico no aguardo. Abraço.

Claro meu amigo ! Segue i meu repositório do git.

https://github.com/RenatoAreas/listaDeCompra

solução!

Fala Renato, achei.

O seu código estava solicitando somente a Data:

  criarItem(nomeDoItem: string) {
    const id = this.listaDeCompra.length + 1;
    const item: Item = {
      id: id,
      nome: nomeDoItem,
      data: new Date().toLocaleDateString('pt-BR'),
      comprado: false
    };
    console.log(item);

    return item;
  }

Perceba que o método ..toLocateDateString('pt-BR'), o Date, isso faz com que o metódo retorne somente a Data, para resolver isso troque-o para data: new Date().toLocaleString('pt-BR'),.

Fiz um teste aqui e deu certo. Testa ai também.

Abraço e bons estudos. Qualquer coisa estou a disposição.

Valeu Diego, ficou muito mais claro agora. Fiz o teste aqui e funcionou também !