Como posso detectar cliques fora de um componente no Angular?
html
events
angular
typescript
AMagyar
fonte
fonte
Respostas:
Um exemplo prático - clique aqui
fonte
Uma alternativa para a resposta de AMagyar. Esta versão funciona quando você clica no elemento que é removido do DOM com um ngIf.
http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview
fonte
Vincular ao clique do documento por meio de @Hostlistener é caro. Ele pode e terá um impacto visível no desempenho se você usar excessivamente (por exemplo, ao construir um componente suspenso personalizado e tiver várias instâncias criadas em um formulário).
Sugiro adicionar um @Hostlistener () ao evento de clique do documento apenas uma vez dentro do componente principal do aplicativo. O evento deve empurrar o valor do elemento de destino clicado dentro de um assunto público armazenado em um serviço de utilidade global.
Quem estiver interessado no elemento alvo clicado deve se inscrever no assunto público do nosso serviço de utilitários e cancelar a inscrição quando o componente for destruído.
fonte
As respostas mencionadas acima estão corretas, mas e se você estiver fazendo um processo pesado depois de perder o foco do componente relevante. Para isso, eu vim com uma solução com dois sinalizadores onde o processo do evento focus out só ocorrerá quando perder o foco do componente relevante apenas.
Espero que isso ajude você. Corrija-me se tiver perdido alguma coisa.
fonte
Você pode usar o métodoeclickOutside () do pacote https://www.npmjs.com/package/ng-click-outside
fonte
A resposta do ginalx deve ser definida como a resposta padrão imo: este método permite muitas otimizações.
O problema
Digamos que temos uma lista de itens e em cada item queremos incluir um menu que precisa ser alternado. Incluímos uma alternância em um botão que escuta um
click
evento em si(click)="toggle()"
, mas também queremos alternar o menu sempre que o usuário clicar fora dele. Se a lista de itens aumentar e anexarmos um@HostListener('document:click')
em cada menu, todos os menus carregados no item começarão a ouvir o clique em todo o documento, mesmo quando o menu estiver desativado. Além dos problemas de desempenho óbvios, isso é desnecessário.Você pode, por exemplo, se inscrever sempre que o pop-up for alternado por meio de um clique e começar a ouvir "cliques externos" somente então.
E, em
*.component.html
:fonte
tap
operador. Em vez disso, useskipWhile(() => !this.isActive), switchMap(() => this._utilitiesService.documentClickedTarget), filter((target) => !this._elementRef.nativeElement.contains(target)), tap(() => this._toggleMenuSubject$.next(false))
. Desta forma, você utiliza muito mais RxJs e pula algumas assinaturas.Melhorando o @J. Resposta de Frankenstein
fonte
você pode chamar a função de evento como (focusout) ou (blur) e depois colocar seu código
fonte