2016-05-24 5 views
1

Я пытаюсь проверить, какой из прослушивателей событий установить, установив 'ontouchstart' in window ? 'touchend' : 'click', а затем я хочу добавить это внутри @HostListener, но я не могу это сделать, потому что this является недоступны в разделе document:click.Как получить доступ к переменной класса внутри обработчика события HostListener

Вы можете как-то добиться этого?

constructor(private _globals: GlobalVariablesService, private _elementRef: ElementRef) { 
    this.ns = _globals.ns; 
    this.deviceListener = ('ontouchstart' in window ? 'touchend' : 'click'); 
} 

// How can I add the this.deviceListener instead of click? 
@HostListener('document:click', ['$event']) 
onOutsideClick(e) { 

    // If the clicked element is not the component element or any of its children, close the dropdown 
    if (this._elementRef.nativeElement !== e.target && !this._elementRef.nativeElement.contains(e.target)) { 
    this.close(); 
    } 
} 
+0

См., Если это поможет: http://stackoverflow.com/questions/35080387/dynamically-add-event-listener-in-angular-2. В принципе, добавьте его в конструктор. –

+0

@MarkRajcok После ответа на вопрос, который я опубликовал вчера, у меня создалось впечатление, что вы не должны добавлять таких слушателей событий. – Chrillewoodz

+0

С помощью какой переменной вы пытаетесь получить доступ? В чем проблема с доступом к 'deviceListener'? 'this.deviceListener' должен просто работать в' onOutsideClick() {...} ' –

ответ

3

Использование

@HostListener('document:' + ('ontouchstart' in window ? 'touchend' : 'click'), ...) 

или добавить его императивно внутри конструктора, как показано в этом вопросе: Dynamically add event listener in Angular 2:

constructor(elementRef: ElementRef, renderer: Renderer) { 
    if('ontouchstart' in window) { 
     this.listenFn = renderer.listenGlobal('document', 'ontouchstart', (event) => { 
      // do something with 'event' 
     }); 
    } else { 
     this.listenFn = renderer.listenGlobal('document', 'click', (event) => { 
      // do something with 'event' 
     }); 
    } 
} 
ngOnDestroy() { 
    this.listenFn(); // removes the listener 
} 

Если добавить его императивно, не забудьте удалить это обязательно.

+0

Какова цель использования средства визуализации вместо прямого привязки непосредственно? – Chrillewoodz

+0

@Chrillewoodz, если вам нужна более сложная логика привязки, используйте Renderer. Для вашего конкретного сценария HostListener в порядке. –

Смежные вопросы