2016-10-18 3 views

ответ

26
import { Component, ElementRef, HostListener, Input } from '@angular/core'; 

@Component({ 
    selector: 'selector', 
    template: ` 
    <div> 
     {{text}} 
    </div> 
    ` 
}) 
export class AnotherComponent { 
    public text: String; 

    @HostListener('document:click', ['$event']) 
    clickout(event) { 
    if(this.eRef.nativeElement.contains(event.target)) { 
     this.text = "clicked inside"; 
    } else { 
     this.text = "clicked outside"; 
    } 
    } 

    constructor(private eRef: ElementRef) { 
    this.text = 'no clicks yet'; 
    } 
} 

Plunker working example - click here

+0

@SonaG. Я исправил пример plnkr, и я протестировал его в своем мобильном телефоне, и, похоже, он работает. – AMagyar

+0

Да, используя хром. Вы можете попробовать изменить прослушиватель событий. Он должен работать – AMagyar

+0

Это не работает, когда элемент элемента, контролируемый ngIf внутри элемента триггера, поскольку ngIf удаляет элемент из DOM, происходит до события click: http://plnkr.co/edit/spctsLxkFCxNqLtfzE5q? p = preview –

1

Альтернативой ответ AMagyar в. Эта версия работает, когда вы нажимаете на элемент, который удаляется из DOM с помощью ngIf.

http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview

private wasInside = false; 
 
    
 
    @HostListener('click') 
 
    clickInside() { 
 
    this.text = "clicked inside"; 
 
    this.wasInside = true; 
 
    } 
 
    
 
    @HostListener('document:click') 
 
    clickout() { 
 
    if (!this.wasInside) { 
 
     this.text = "clicked outside"; 
 
    } 
 
    this.wasInside = false; 
 
    }