2016-12-07 73 views
1
<a appMenuDropDown (click)="getSubMenuItems(menuItem)"> 
....... 
</a> 

當一個元素有一個指令(appMenuDropDown)監聽點擊事件和點擊事件處理程序,會發生什麼點擊相同的元素事件(getSubMenuItems())?哪個處理程序首先被觸發?處理程序中的指令或getSubMenuItems()?指令與點擊監聽器,並在Angular2

@HostListener('click') 
clickListener() { 
    let sourceElement = this.el.nativeElement; 
    .... 
} 
+0

我認爲元素的事件會先被觸發。你可以簡單地使用'console.log',看看...... – Dimanoid

回答

0

我認爲,在指令中的情況下HostListener將永遠燒製的第一

您可以在generateHandleEventMethod方法看一看編譯器內從源代碼

directives.forEach((dirAst, dirIdx) => { 
    ... 
}); 
boundEvents.forEach((renderEvent, renderEventIdx) => { 
    ... 
}); 

https://github.com/angular/angular/blob/2.2.4/modules/%40angular/compiler/src/view_compiler/event_binder.ts#L92-L115

,這裏是生成元件。生產廠家

View_AppComponent0.prototype.handleEvent_4 = function(eventName,$event) { 
    var self = this; 
    self.debug(4,2,4); 
    self.markPathToRootAsCheckOnce(); 
    var result = true; 
    result = (self._AppMenuDropDownDirective_4_3.handleEvent(eventName,$event) && result); 
    if ((eventName == 'click')) { 
    var pd_sub_0 = (self.context.getSubMenuItems() !== false); 
    result = (pd_sub_0 && result); 
    } 
    return result; 
}; 

Demo

+0

在我所有的測試中,它確實是指令處理程序。我不確定它是否按照特定順序編程。感謝您的演示和編譯的代碼。 –

1

事件處理程序的順序是顯式未定義的。 另外,如果您對元素有多個指令,則它們添加的順序對處理事​​件處理程序的順序不重要。