angular - Evento cada vez que o componente se torna visível
Existe uma maneira no Angular2 de disparar um evento quando meu componente se torna visível? Ele está colocado em um controle de abas e eu quero ser notificado quando o usuário mudar de aba. Eu gostaria que meu componente disparasse um evento.
Resposta #1
O que eu finalmente fiz (o que não é muito bonito, mas funciona enquanto eu não tiver uma maneira melhor de fazer...) foi usar o callback ngAfterContentChecked() e lidar com a mudança eu mesmo.
@ViewChild('map') m;
private isVisible: boolean = false;
ngAfterContentChecked(): void
{
if (this.isVisible == false && this.m.nativeElement.offsetParent != null)
{
console.log('isVisible switched from false to true');
this.isVisible = true;
this.Refresh();
}
else if (this.isVisible == true && this.m.nativeElement.offsetParent == null)
{
console.log('isVisible switched from true to false');
this.isVisible = false;
}
}
Resposta #2
Não existe tal evento, mas se você estiver usando um controle de abas, a maneira correta de fazer isso seria criar um @Output de mudança de aba para o seu controle de abas se ele for personalizado, caso contrário, a maioria dos controles de abas (como ng-bootstrap) também possui algum evento de mudança de aba.
Se o seu componente precisa estar ciente disso, você pode usar este evento de mudança de aba para detectar qual aba está visível, e se você sabe qual aba está visível, você também sabe se o seu componente está visível ou não. Então você pode fazer algo assim:
onTabChange(event) {
this.currentTab = /** Get current tab */;
}
E então você pode enviá-lo para o próprio componente se você tiver uma entrada:
@Input() activated: boolean = false;
E então você pode aplicá-lo com:
<my-component [activated]="currentTab == 'tabWithComponent'"></my-component>
Agora você pode ouvir OnChanges para ver se o valor do modelo activated mudou para true.
Você também pode refatorar isso para usar um serviço com um Observable assim:
@Injectable()
export class TabService {
observable: Observable<any>;
observer;
constructor() {
this.observable = Observable.create(function(observer) {
this.observer = observer;
});
}
}
Quando um componente deseja ouvir essas alterações, ele pode se inscrever em tabService.observable. Quando sua aba mudar, você pode enviar novos itens para ele com tabService.observer.next().
