在模式外部单击关闭Angular2模式

在模式外部单击关闭Angular2模式,angular,onclick,Angular,Onclick,这是要单击外部以禁用选择的示例代码。在本例中,我可以取消选择,但只有在单击元素以激活侦听器之后。我想用这个例子在任何时候点击模态外部关闭模态。任何例子都将不胜感激 activeIndex = 0; subscription: any; init$: Subject<any> = new Subject(); stop$: Subject<any> = new Subject(); ngOnInit() { let click$ = Observable.fromE

这是要单击外部以禁用选择的示例代码。在本例中,我可以取消选择,但只有在单击元素以激活侦听器之后。我想用这个例子在任何时候点击模态外部关闭模态。任何例子都将不胜感激

activeIndex = 0;

subscription: any;
init$: Subject<any> = new Subject();
stop$: Subject<any> = new Subject();

ngOnInit() {
  let click$ = Observable.fromEvent(document, 'click');

const clickOutside$ = this.init$.flatMap(() => {
  return click$.takeUntil(this.stop$);
});

this.subscription = clickOutside$.subscribe(() => {
  this.activeIndex = null;
  console.log(1);
  this.stop$.next();
});
}

onItemClicked(event, index: number) {
event.stopPropagation()
this.activeIndex = index;
this.init$.next()
}

ngOnDestroy() {
if(this.subscription) {
  this.subscription.unsubscribe();
}
}
activeIndex=0;
认购:任何;

init$:Subject

所以我举了一个例子,说明如何关闭我创建的自定义下拉列表,但我相信它也适用于此

因此,在组件内部:

openModal() { document.addEventListener('click', this.offClickHandler.bind(this)); }

offClickHandler(event:any) {
    if (!event.target.closest(".select-options") && !event.target.closest(".select-input")) { 
        // do whatever you want here
        // close the modal
        // call document.removeEventListener
    }
}

因此,这将查找按钮和div之外的单击,但对于您来说,我只需将.closest()设置为您希望看到关闭的模式。然后在if语句中关闭您的模式。

因此,我有一个示例,说明了如何关闭我创建的自定义下拉列表,但我相信它也适用于此

因此,在组件内部:

openModal() { document.addEventListener('click', this.offClickHandler.bind(this)); }

offClickHandler(event:any) {
    if (!event.target.closest(".select-options") && !event.target.closest(".select-input")) { 
        // do whatever you want here
        // close the modal
        // call document.removeEventListener
    }
}

因此,这将查找按钮和div之外的单击,但对于您来说,我只需将.closest()设置为您希望看到关闭的模式。然后在if语句中关闭模态。

嘿,Joshsiley,我试过了,但它不会停止收听单击事件。一旦模态关闭,我想停止收听事件。它确实有效,但并不完全如我所愿。谢谢你的帮助。明白了,另一个可行的方法是在打开模式时添加事件侦听器,然后在关闭弹出窗口时在if语句中关闭它。如何关闭它。我正在尝试document.removeEventListener('click',this.offClickHandler.bind(this));是的,您希望通过执行document.removeEventListener('click',this.offClickHandler.bind(this)),来删除它;我还编辑了答案,以便在单击按钮打开模式时仅添加事件侦听器,这样它就不会一直侦听,并且仅在模式打开时侦听Hey joshsisley我尝试了此操作,但它不会停止侦听单击事件。一旦模态关闭,我想停止收听事件。它确实有效,但并不完全如我所愿。谢谢你的帮助。明白了,另一个可行的方法是在打开模式时添加事件侦听器,然后在关闭弹出窗口时在if语句中关闭它。如何关闭它。我正在尝试document.removeEventListener('click',this.offClickHandler.bind(this));是的,您希望通过执行document.removeEventListener('click',this.offClickHandler.bind(this)),来删除它;我还编辑了答案,以便在单击按钮打开模式时仅添加事件侦听器,这样它就不总是侦听,而只在模式打开时侦听