第二个打开时关闭下拉/单击Angular 5阻止document.click

时间:2017-12-07 09:46:26

标签: angular domdocument angular2-directives angular-directive

我正在尝试为下拉菜单创建一个指令,只要我使用单一的指令就像魅力一样。我可以使用以下代码点击外部下拉列表:

@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中应该关闭第一个下拉菜单的正确方法是什么?

2 个答案:

答案 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
   }
}