J'ai un composant Angulaire qui dépend d'un événement de clic qui se produit sur le composant de l'application racine. L'enfant est situé dans des endroits aléatoires dans le composant <app>
, donc pourquoi je ne l'ai pas mentionné.
@Component({ template: '<div>Child!</div>' }) export class Child { constructor () {} } @Component({ selector: 'app', template: '<div (click)=foo()></div>' }) export class App { rootClickEmitter = new EventEmitter(); foo () { this.rootClickEmitter.emit('bar'); } }
Comment puis-je que le composant enfant reçoive l'événement rootClickEmitter
?
Pour "cliquer à l'extérieur", essayez ceci:
@Component({ selector: 'child', template: '<div (click)="childClick($event)">child content here</div>', host: { '(document:click)': 'docClick()' } }) export class Child { docClick() { console.log('clicked outside'); } childClick(ev) { console.log('child click'); ev.stopPropagation(); } }
Plunker
Mise à jour: Eric a simplement posté ce qui suit dans une autre réponse :
"Vous pouvez utiliser listenGlobal qui vous donnera accès au document, au corps, etc.
renderer.listenGlobal('document', 'click', () => { console.log('Document clicked'); });