按下输入按钮时 ngbDatepicker 不起作用 [英] ngbDatepicker not working when enter button it pressed

查看:40
本文介绍了按下输入按钮时 ngbDatepicker 不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 ngbDatepicker,它仅在我从下拉列表中选择日期时才有效.但是,如果我通过键盘更改日期并按 Enter 键,则什么也不会发生.

<输入名称=日期选择器"类=形式控制"ngbDatepicker#datepicker="ngbDatepicker"[autoClose]="'外面'"(dateSelect)="onDateSelection($event)"[displayMonths]="2"[dayTemplate]="t"外面的日子=隐藏"[开始日期]="从日期"><ng-template #t let-date let-focused="focused"><span class="custom-day"[class.focused]="聚焦"[class.range]="isRange(date)"[class.faded]="isHovered(date) || isInside(date)"(mouseenter)="hoveredDate = 日期"(mouseleave)="hoveredDate = null">{{ date.day }}</span></ng-模板>

在组件中:

isHovered(date: NgbDate) {返回 this.fromDate &&!this.toDate &&this.hoveredDate &&date.after(this.fromDate) &&date.before(this.hoveredDate);}isInside(日期:NgbDate){返回 date.after(this.fromDate) &&date.before(this.toDate);}isRange(日期:NgbDate){返回 date.equals(this.fromDate) ||date.equals(this.toDate) ||this.isInside(date) ||this.isHovered(日期);}验证输入(当前值:NgbDate,输入:字符串):NgbDate {const parsed = this.formatter.parse(input);返回解析的 &&this.calendar.isValid(NgbDate.from(parsed)) ?NgbDate.from(parsed) : currentValue;}

在组件中:

onDateSelection(date: NgbDate) {如果 (!this.fromDate && !this.toDate) {this.fromDate = 日期;this.emitFromDate();} else if (this.fromDate && !this.toDate && date.after(this.fromDate)) {this.toDate = 日期;this.emitToDate();} 别的 {this.toDate = null;this.fromDate = 日期;this.emitFromDate();}}

有没有人遇到过这种情况并且能够让它工作?

解决方案

来自 ngx-bootstrap 的输入元素是动态创建的,似乎没有提供与它们交互的界面.

作为一种变通方法,您可以检索对这些输入的引用(在 ngAfterViewInit 中)并将侦听器绑定到关键事件,如下所示

component.ts

ngAfterViewInit(){让 dpFrom = document.querySelector('input[name=dpFromDate]');this.renderer.listen(dpFrom,"keydown", (evt: KeyboardEvent)=>{if(evt.key=='回车'){console.log('从选择日期开始', this.fromDate);}});让 dpTo = document.querySelector('input[name=dpToDate]');this.renderer.listen(dpTo,"keydown", (evt: KeyboardEvent)=>{if(evt.key=='回车'){console.log('选择日期', this.toDate);}})}

这是一个stackblitz 示例

I am using ngbDatepicker and it works only if I select the date from the dropdown. However if I change the date via keyboard and press enter nothing happens.

<div class="input-group">
                            <input name="datepicker"
                                   class="form-control"
                                   ngbDatepicker
                                   #datepicker="ngbDatepicker"
                                   [autoClose]="'outside'"
                                   (dateSelect)="onDateSelection($event)"
                                   [displayMonths]="2"
                                   [dayTemplate]="t"
                                   outsideDays="hidden"
                                   [startDate]="fromDate">
                            <ng-template #t let-date let-focused="focused">
                                <span class="custom-day"
                                      [class.focused]="focused"
                                      [class.range]="isRange(date)"
                                      [class.faded]="isHovered(date) || isInside(date)"
                                      (mouseenter)="hoveredDate = date"
                                      (mouseleave)="hoveredDate = null">
                                  {{ date.day }}
                                </span>
                            </ng-template>

in the component:

isHovered(date: NgbDate) {
        return this.fromDate && !this.toDate && this.hoveredDate && date.after(this.fromDate) && date.before(this.hoveredDate);
    }

    isInside(date: NgbDate) {
        return date.after(this.fromDate) && date.before(this.toDate);
    }

    isRange(date: NgbDate) {
        return date.equals(this.fromDate) || date.equals(this.toDate) || this.isInside(date) || this.isHovered(date);
    }

    validateInput(currentValue: NgbDate, input: string): NgbDate {
        const parsed = this.formatter.parse(input);
        return parsed && this.calendar.isValid(NgbDate.from(parsed)) ? NgbDate.from(parsed) : currentValue;
    }

in component:

onDateSelection(date: NgbDate) {
        if (!this.fromDate && !this.toDate) {
            this.fromDate = date;
            this.emitFromDate();
        } else if (this.fromDate && !this.toDate && date.after(this.fromDate)) {
            this.toDate = date;
            this.emitToDate();
        } else {
            this.toDate = null;
            this.fromDate = date;
            this.emitFromDate();
        }
    }

Has anyone encountered this and was able to get it to work?

解决方案

Input elements from ngx-bootstrap are created dynamically and don't seem to provide an interface to interact with them.

As a work around, you can retrieve a reference on these inputs (in ngAfterViewInit) and manyally bind a listener to key events, like below

component.ts

ngAfterViewInit()
{
    let dpFrom = document.querySelector('input[name=dpFromDate]');
    this.renderer.listen(dpFrom,"keydown", (evt: KeyboardEvent)=>
    {
      if(evt.key=='Enter')
      {
        console.log('From date selected', this.fromDate);
      }

    });

    let dpTo = document.querySelector('input[name=dpToDate]');
    this.renderer.listen(dpTo,"keydown", (evt: KeyboardEvent)=>
    {
      if(evt.key=='Enter')
      {
        console.log('To date selected', this.toDate);
      }

    })

}

Here is a stackblitz example

这篇关于按下输入按钮时 ngbDatepicker 不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆