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

Input e Output Properties entre componentes

Olá estou com tentando criar um cenário com as seguintes características:

  • tenho um component chamado app-photo;
  • outro component chamado app-graphic; Chamos os dois no app.component.html, tenho uma imagem no app-graphic e um botão no app-photo, até então tudo funcionando. Porém eu preciso que ao clicar no botão que está no app-photo mude a classe da minha imagem que está em app-graphic. Eu já tentei usar o seguinte comando no componente app-photo:
 @Output() mudouValor = new EventEmitter();


  bAlterar() {    
    this.mudouValor.emit("true");
  }

Mas no app-graphic não estou sabendo como receber o evento e aplicar o estilo de classe nova. Já pensei usar diretivas também, mas não consegui. Enfim fiquei com dúvida também se devo implementar com diretiva ou Output.

3 respostas
solução!

Fala aí Alberto, beleza? Para realizar a comunicação entre componentes filhos para os pais, é mais ou menos do jeito que você está fazendo, mas, tem algumas diferenças:

Dentro do seu componente filho, crie um EventEmitter e anote ele como @Output:

export class ComponenteFilho {

    @Output alterarFoto = new EventEmitter()

}

Dai dentro da sua função de click no botão, você faz o .emit dele:

cliqueiNoBotao() {
    this.alterarFoto.emit(true);
}

E mapeia o click com a função nos eu tempalte:

<button (click)="cliqueiNoBotao()">Meu Botao</button>

Agora, no componente pai, você precisa receber esse evento emitido, para isso, cria uma função que vai recebê-lo:

export class ComponentePai {

    receberEvento(cliquei) {
        console.log(cliquei);
    }

}

E mapeie ela junto com a propriedade @Output do filho:

<app-componente-filho (alterarFoto)="receberEvento($event)"></app-componente-filho>

Dessa maneira, ao realizar o .emit ele vai chamar a função receberEvento localizada dentro do componente pai e como parâmetro recebe o valor que você passou para o emit.

Espero ter ajudado.

Opa, muito obrigado Matheus, me ajudou muito!!

  • Esse é o photo.component.html.

    <button class="btn btn-debug" (click)="onMyClick()" >Change</button>
  • photo.component.ts

    @Output() alterar = new EventEmitter();
    
    onMyClick(){
      this.alterar.emit();
    }
  • No app.componente.html, ficou assim.

    <asf-graphic [isCircle]="img"></asf-graphic>
      <asf-photo (alterar)="receberEvento($event)"></asf-photo>
  • componente app.component.ts

    isCircle: string ;
     img: boolean ;
    
    receberEvento(cliquei){
      this.img = !this.img;
    }
  • graphic.component.html

    <img src="assets/img/avatar-3.jpg" [class.rounded-circle]="isCircle">
  • graphic.component.ts

    @Input() isCircle: boolean ;

Boa Alberto, é exatamente assim, parabéns \o/