A ideia básica é que eu queira que o texto "Carregando" seja exibido enquanto o componente filho estiver carregando dados e, em seguida, desapareça quando terminar. Mas como o componente pai pode saber quando o filho terminou de carregar os dados?
Meu pai se parece com isso:
<div *ngIf="isLoadingFlg">Loading...</div>
<router-outlet></router-outlet>
De alguma forma, preciso que o componente filho consiga definir o componente pai isLoadingFlg
. O componente filho se parece com isto:
ngOnInit() {
this.isLoadingFlg = true;
setTimeout(() => {
this.isLoadingFlg = false;
}, 1000);
}
Se o componente filho estivesse simplesmente no modelo do pai, isso seria um trabalho para o decorador @Output , mas como parece haver roteamento envolvido aqui, eu usaria um serviço compartilhado .
Crie um serviço compartilhado mais ou menos assim:
carregando.serviço.ts
Observe
providedIn: 'root'
aqui: é isso que torna o serviço compartilhado entre todos os outros componentes que o utilizam.E no componente filho, injete esse serviço compartilhado usando injeção de dependência e, quando o carregamento terminar, notifique o serviço compartilhado.
criança.componente.ts
E no pai, injete o serviço novamente, mas desta vez ouça as alterações do serviço de carregamento e atualize
isLoadingFlg
quando recebê-las.pai.componente.ts
Aqui está um StackBlitz mostrando um exemplo funcional: https://stackblitz.com/edit/stackblitz-starters-6c5kzgbg?file=src%2Fparent%2Fparent.component.ts