angular - ngx-bootstrap 弹出窗口在外部点击时关闭

标签 angular typescript events bootstrap-4 ngx-bootstrap

我正在尝试创建一个 Angular 4 自定义表单控件作为我的日期选择器。我正在使用 ngx-bootstrap,到目前为止,我已经使用 ngx-bootstrap 中的输入、日期选择器和弹出框组件设置了这个自定义表单控件。自定义控件打开一个弹出窗口,其中日期选择器处于焦点位置,但是,我需要能够通过与弹出窗口内容交互来更改日期,并且当我不与弹出窗口或输入交互时,它应该关闭。我试图跟踪 the ngx-bootstrap github issue 上的黑客攻击。但是它不适用于我的情况。任何帮助,将不胜感激。

date-picker.component.html

<input type="text" [value]="getDate() | date:'fullDate'" #popover="bs-popover" [placeholder]="placeholder" class="form-control"  triggers="" (focus)="popover.show()" [popover]="popTemplate" container="body" required>
<template  #popTemplate>
  <datepicker  [(ngModel)]="dt"  [minDate]="minDate" [showWeeks]="true"
               [dateDisabled]="dateDisabled"></datepicker>
</template>

日期选择器.component.ts

@Component({
  selector: 'app-date-picker',
  templateUrl: './date-picker.component.html',
  styleUrls: ['./date-picker.component.scss'],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => DatePickerComponent),
      multi: true
    }
  ]
})
export class DatePickerComponent implements OnInit, ControlValueAccessor {
 @ViewChild('popover') popover;

  isOpen = false;

  @Input('placeholder') placeholder;
constructor(private _er: ElementRef) {
}

  @HostListener('click', ['$event']) onClick(event): void {
    console.log(event);
    if (
      this.isOpen
      && !this._er.nativeElement.contains(event.target)
      && !this.popover._popover!._componentRef!.location.nativeElement!.contains(event.target)
    ) {
      this.hide();
    }
  }

  hide() {
    this.isOpen = false;
    this.popover.hide();
  }

  show() {
    this.isOpen = true;
    this.popover.show();
  }
}

即使我在输入框或弹出框之外单击,它也会保持打开状态。当使用模糊事件时,我什至无法与日历交互。甚至在我选择日期之前它就会关闭。 enter image description here

最佳答案

@HostListener装饰器在 Angular API Doc 中没有描述,但它将事件监听器绑定(bind)到组件宿主元素。在你的情况下<app-date-picker> 。 但是,当您单击弹出窗口本身之外的任何位置时,您希望隐藏弹出窗口,因此您需要将监听器绑定(bind)到整个页面(文档)。为此,您必须添加 document:事件名称的前缀:

@HostListener('document:click', ['$event'])

我不知道是否还有其他支持的前缀,也许window 。您可以使用 Plunker 来处理事件(来自此question)。还有一个关于meaning of the HostListener decorator的问题.

关于angular - ngx-bootstrap 弹出窗口在外部点击时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44691768/

相关文章:

Symfonydustin10/VichUploaderBundle 事件

angular - 操作必须具有类型属性错误 NgRx

angular - 如何将表单放入单独的文件中 Angular 4

带有新 Observable 和 ng-template 的 Angular 4 异步管道不起作用

javascript - Angular 2 - 使用 TypeScript 使用地理定位获取当前位置的名称

javascript - 使用 typescript 计算周数 - 算术运算的右侧必须为 'any' 类型

javascript - slider 每次滑动不超过一次迭代 (JavaScript)

javascript - Ioniq 5 模态路线

javascript - 从对象数组中的属性创建字符串文字联合

javascript - 捕获除重置之外的所有事件