我正在尝试为下拉菜单创建一个指令,只要我使用单一的指令就像魅力一样。我可以使用以下代码点击外部下拉列表:
@HostListener('document:click', ['$event'])
onDocumentClick(event: any): void {
console.log("document click");
// close
}
@HostListener('click')
onClick(): void {
console.log('click on ');
// toggle
}
创建了2个下拉列表时出现问题。我希望在第二次打开时关闭第一个下拉列表,但是当我点击第二个下拉列表时,只有“click”事件被触发并且“document.click”没有被执行。我希望这两个事件都应该发生,除非我明确地在click上使用preventDefault,但显然这会自动发生。
当第二个打开时,Angular 5中应该关闭第一个下拉菜单的正确方法是什么?
答案 0 :(得分:0)
也许你可以尝试这样的事情:
@HostListener('document:click', ['$event'])
onClick(event) {
if(this.eRef.nativeElement.contains(event.target)) {
// toggle logic
} else {
// close logic
}
}
因此,如果您在元素内部或外部单击,则不会让两个事件相互冲突,而是会有一个具有两个逻辑的事件来准确处理您需要的内容。说得通?
这取自here
答案 1 :(得分:0)
创建一个可以在任何地方使用的指令怎么样?
@Directive( {
selector : '[clicked-outside]' ,
host : {
'(document:click)' : 'onClick($event)',
'(document:touch)' : 'onClick($event)',
'(document:touchstart)' : 'onClick($event)'
}
} )
export class ClickedOutsideDirective {
@Input( 'clicked-outside' ) callback : Function;
constructor ( private _el : ElementRef ) {
}
private onClick ( event : any ) {
if ( this.clickedOutside( event ) ) {
if ( this.callback ) {
this.callback();
}
}
}
private clickedOutside ( event : any ) {
let clickedTarget = event.target;
let host = this._el.nativeElement;
do {
if ( clickedTarget === host ) {
return false;
}
clickedTarget = clickedTarget.parentNode;
} while ( clickedTarget );
return true;
}
}
你可以像这样使用它:
@Component({
selector:'your-dropdown',
template:`
<div class="your-dropdown-top-most-wrapper" [clicked-outside]="onClickOutSide"></div>
`
})
export class YouDropdownComponent{
public onClickOutSide = ()=>{
this.closeMyDropdown()// this is your function that closes the dropdown
}
}