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

Dúvida sobre inbound properties

Estou tento um problema: Tenho um componente (pai) que tem um botão, e outro componente (filho) que mostra um toast ao clicar nesse botão. O componente filho tem uma inbound properties, onde recebe o valor do componente pai. Acontece que a mensagem só é mostrada na primeira vez que clico no botão, depois o valor de

showToast

não sai de valor falso.

O que eu acho que pode estar acontecendo é o componente pai tá perdendo a referência da inbound properties. Eu envio um valor true por inbound properties, o toast é mostrado, depois de 2000ms o próprio componente toast.component muda o valor para false, assim o toast não né mais exibido. Quando o pai envia novamente o valor true, esse valor não é alterado, não mostrando mais o toast.

Fiz um exemplo do erro que eu estou obtendo:

app.component.ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  mostrar: boolean = false;

  mostrarMensagem() : void {

    this.mostrar = true;

  }
}

app.component.html

<h1>Teste do Toast</h1>

<button type="button" (click)="mostrarMensagem()" class="btn btn-primary">Mostrar mensagem</button>

<app-toast [showToast]="mostrar"></app-toast>

toast.component.ts

import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';

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

  @Input() showToast: boolean = true;

  constructor() { }

  ngOnInit(): void {
  }
}

toast.component.html

<ngb-toast class="bg-success text-light" *ngIf="showToast" (hide)="showToast = false" delay="2000">
    Teste do toast
</ngb-toast>

<p>mostrar mensagem: {{ showToast }}</p>

Obs: estou utilizando o Ng Bootstrap. https://ng-bootstrap.github.io/#/components/toast/overview

3 respostas
solução!

Fala ai Luan, tudo bem? Nesse caso acho que você precisa emitir um evento de volta para o pai, onde vai passar o valor false, assim, o pai vai mudar o valor da variavel mostrar para false e deixar esse controle apenas no pai.

Nesse caso, você precisaria disparar um EventEmitter para o pai e enviar o valor para o mesmo alterar a variavel.

Dá uma olhada nesse artigo: https://medium.com/@danilodev.silva/angular-5-eventemitter-aprendendo-a-usar-input-e-output-property-56df9158de6b

Ele explica bem detalhado como seria essa comunicação do filho para o pai.

Espero ter ajudado.

Matheus, muito obrigado pela ajuda! Deu certo!

Magina Luan, sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.