2016-11-17 3 views
9

Поскольку нет шаблона, какой способ прослушать дочерние элементы в директиве? Можно ли с HostListener? Если нет, есть ли другой способ?Как прослушивать события дочерних элементов в директиве?

Существует также аналогичный вопрос: How to listen for child event from parent directive in Angular2, но предлагаемый подход не решает мою проблему, так как моя директива и дочерний элемент не находятся в одном шаблоне (директива находится на хосте).

Cheers!

Редактировать # 1

Это, как я сейчас делаю это (там должен быть лучший способ):

Первый инъекционного ElementRef в моей директиве:

constructor(private elView: ElementRef) {} 

Затем связывание с jQuery (или простой JS):

$(this.elView.nativeElement) 
.on('drag', '#childId', this.slide.bind(this)) 
+0

Я не уверен, но [это] (http://orizens.com/wp/topics/angular-2-attribute-directive-creating-an -infinite-scroll-директива /) может быть полезна – ulubeyn

ответ

6

Если событие, которое вы хотите слушать является уроженцем события DOM, что пузыри, то вы можете просто использовать @HostListener()

@HostListener('click', ['$event']) 
handleClick(event) { 
    // handle event 
} 

Если они являются выходами дочерних компонентов, вы можете запросить их и подписаться на их выходы

@ContentChildren(ChildComponent) children:QueryList<ChildComponent>; 

ngAfterContentInit() { 
    this.children.toArray().forEach((item) => { 
    item.someOutput.subscribe(...); 
    }); 
} 

или вы можете использовать подход, используемый в ответе, на который вы ссылаетесь в своем вопросе.

+0

Спасибо за ваш ответ. 'HostListener' не достаточно пуленепробиваемый, так как многие события не будут распространяться из-за' stopPropagation'. Я надеялся на что-то, что позволило бы мне привязать непосредственно к дочернему элементу. – maximedupre

+0

Вот что '@ContentChildren()' делает или как также предлагалось в другом ответе - это общая служба. –

+0

Эти два метода не будут работать, так как я не обязательно слушаю события, которые были инициированы компонентами. Я также (в основном) хочу слушать события DOM, инициированные «нормальными» элементами. – maximedupre

1

Возможно, вы захотите, чтобы ваши компоненты взаимодействовали друг с другом через сервис-класс.

// service class 
class Service { 
    private someEventSource = new Subject(); 
    public someEvent = this.someEventSource.asObservable(); 

    public invokeAnEvent (data: string) { 
    this.someEventSource.next(data); 
    } 
} 

// parentComponent class 
Service.someEvent.subscribe(data => { 
    console.log(data); 
}); 

// childComponent class 
Service.invokeAnEvent('some data to pass'); 

С угловыми документации:
https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

+1

Я думаю, что это было бы излишним, чтобы слушать события DOM. – maximedupre

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