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

Ajuda com Output /BehaviorSubject

Saudadoes Flavio,

Tenho uma tela com a 2 partes parte 1. Um modulo com um caixa de seleção (Combobox) parte 2. Um conjunto de tabs Algo assim: empresa:<--lista de empresas cadastradas--> ----perfil-----------usuarios--> (opcoes da tab) a parte 1 (combobox) e um component separado (um modulo) e a cada seleção faço a emissão do valor com o BehaviorSubject ate ai tudo bem. No entanto o problema surge no momento em que as tables sao renderizadas numa a ideia é buscar a innformção do perfil ou usuarios do perfil selecionado mas não consigo encontrar o momento certo para buscar a informação da empresa seleccionada . tentei usar onChange mas não tive sucesso Gostaria que a cada selecao da combobox os valores alterassem Porfavor Você poderia dar uma ajuda com isso!

Desde ja os meus agradecimentos

5 respostas

Gostaria que a cada selecao da combobox os valores das tabs alterassem

Fala aí, beleza? Tem algumas maneiras para você resolver o problema, vamos lá:

  1. No componente que tem o select, a cada change você emit um evento para o componente pai através do @Output, dai no pai, você recebe esse evento e muda a empresa selecionada, dai passa o valor para o componente filho e nele você faz a busca dos dados.
  2. Você poderia criar um PubSubService para trabalhar via eventos, simulando o comportamento da biblioteca PubSub, a ideia é que no change você publique um novo evento para seu service e no componente onde tem os dados da empresa você se inscreve no evento.

Espero ter ajudado.

Obrigado Matheus Castiglioni pelo feedback.

Tentei implementar a primeira opção mais não tive muito sucesso porque no onInit() de cada tab o valor da empresa da empresa ainda nao foi selecionado e quando faco o select não consigo fazer o refresh das tabs.

Voce poderia porfavor mostrar algum exemplo de uso da segunda alternativa.

Desde ja os meus agradecimentos

Lembrendo que para o primeiro caso tentei usar o onChange e no video da explicação diz que o onChange mostrar valor alterados para @Input()

solução!

Fala aí mano, desculpe a demora, está meio corrido por aqui, tente implementar esse EventService:

import { Injectable } from '@angular/core'

import { Observable, Subject, empty, of } from 'rxjs'
import { switchMap } from 'rxjs/operators'

@Injectable({
    providedIn: 'root'
})
export class EventService {

    private event: Subject<any> = new Subject<any>();

    emit(topic, data) {
        this.event.next({ topic, data });
    }

    listen(topic): Observable<any> {
        return this.event
            .pipe(switchMap(data => {
                if (topic === data.topic) {
                    return of(data)
                }
                return empty()
            }))
    }

}

Dai no seu componente filho, você faz um .emit, dentro do ngOnInit de quem precisar receber essa mudança você faz um .listen.

Se quiser, dá uma olhada nesse projeto: https://github.com/mahenrique94/mymusic-frontend

Eu faço o uso nesse esquema.

Espero ter ajudado.