【问题标题】:ElementRef is not working Angular 8 with BsdatepickerElementRef 不能与 Bsdatepicker 一起使用 Angular 8
【发布时间】:2020-01-28 05:35:07
【问题描述】:

我需要什么

  • 我需要从文本框中获取日期值并将格式日期绑定到文本框。

问题

当输入日期时,bsdatepicker 正在改变日期格式。

角度代码

            import { Component, OnInit, ViewEncapsulation,ViewChild,ElementRef } from '@angular/core';
            import { BsDatepickerConfig } from 'ngx-bootstrap/datepicker';

            @Component({
              selector: 'my-app',
              templateUrl: './app.component.html',
              styleUrls: ['./app.component.css'],
              encapsulation: ViewEncapsulation.None
            })
            export class AppComponent implements OnInit {
              myDateValue: Date;
              customInitDate:Date;
              bsConfig: Partial<BsDatepickerConfig>;
              @ViewChild('dp', {static: false}) dpicker: ElementRef;
              ngOnInit() {
                this.myDateValue = new Date();
               // this.bsConfig = Object.assign({},'');
              }

              onDateChange(newDate: any) {
                console.log(newDate);
                console.log(this.dpicker.nativeElement);
                this.customInitDate=newDate;
              }
            }

HTML代码

        <input type="text"
        class="form-control"
        [minDate]="minDate"
        [maxDate]="maxDate"
        #dp
        [bsConfig]="{ dateInputFormat: 'DD-MMM-YYYY' }"
        value="{{ customInitDate | date: 'dd-MMM-yyyy'}}"
        bsDatepicker
        [(bsValue)]="myDateValue"
        [(ngModel)]="customInitDate"
        (ngModelChange)="onDateChange($event)"
        >
        </div>

Bsdatepicker 对象

        BsDatepickerComponent {_config: {…}, placement: "bottom", triggers: "click", outsideClick: true, container: "body", …}
        isOpen: (...)
        _config:
        containerClass: "theme-green"
        displayMonths: 1
        showWeekNumbers: true
        dateInputFormat: "DD-MMM-YYYY"
        rangeSeparator: " - "
        rangeInputFormat: "L"
        locale: "en"
        monthTitle: "MMMM"
        yearTitle: "YYYY"
        dayLabel: "D"
        monthLabel: "MMMM"
        yearLabel: "YYYY"
        weekNumbers: "w"
        value: null
        isDisabled: undefined
        minDate: undefined
        maxDate: undefined
        __proto__: Object
        placement: "bottom"
        triggers: "click"
        outsideClick: true
        container: "body"
        bsValueChange: EventEmitter {_isScalar: false, observers: Array(2), closed: false, isStopped: false, hasError: false, …}
        _subs: (2) [Subscriber, Subscriber]
        containerClass: "theme-green"
        displayMonths: 1
        showWeekNumbers: true
        dateInputFormat: "L"
        rangeSeparator: " - "
        rangeInputFormat: "L"
        locale: "en"
        monthTitle: "MMMM"
        yearTitle: "YYYY"
        dayLabel: "D"
        monthLabel: "MMMM"
        yearLabel: "YYYY"
        weekNumbers: "w"
        _datepicker: ComponentLoader {_viewContainerRef: ViewContainerRef_, _renderer: RendererAdapter, _elementRef: ElementRef, _injector: NgModuleRef_, _componentFactoryResolver: CodegenComponentFactoryResolver, …}
        onShown: EventEmitter {_isScalar: false, observers: Array(0), closed: false, isStopped: false, hasError: false, …}
        onHidden: EventEmitter {_isScalar: false, observers: Array(0), closed: false, isStopped: false, hasError: false, …}
        _bsValue: Fri Dec 08 1989 00:00:00 GMT+0530 (India Standard Time) {}
        bsConfig: {dateInputFormat: "DD-MMM-YYYY"}
        minDate: undefined
        maxDate: undefined
        _datepickerRef: ComponentRef_ {_view: {…}, _viewRef: ViewRef_, _component: BsDatepickerContainerComponent, _elDef: {…}}
        __proto__: Object       

堆栈闪电战

https://stackblitz.com/edit/ngx-bootstrap-datepicker-testing-2e2eyu?file=app%2Fapp.component.html

但它在没有 bsdatepicker 的情况下工作

https://stackblitz.com/edit/ngx-bootstrap-datepicker-testing-13hrji?file=app/app.component.ts

console.log(this.dpicker.nativeElement);

undefined

欢迎提出任何建议。

【问题讨论】:

  • 您想使用 ViewChild 获得价值吗?
  • 我想通过任何方法获取文本框值 .bsdatepicker 更改日期格式或未定义
  • 你试过 ngModelChange $event 参数来获取文本框的值吗?
  • 是的,我试过了,但由于 bsdatepicker 我的第二个 stackblitz 工作没有 bsdatepicker,我得到了错误的值
  • yes dd-mmm-yyyy ,问题是如果输入 27/8/1999 则默认输入格式更改日期格式

标签: javascript angular bootstrap-datepicker ngx-bootstrap


【解决方案1】:

BsDatepickerComponent 已将 ElementRef 作为私有字段注入,使用它来获取 BsDatepickerComponent 输入字段值。将您的 ViewChild 类型更改为 BsDatepickerComponent

试试这个

@ViewChild('dp') dpicker: BsDatepickerComponent;

onDateChange(newDate: any) {
    console.log(newDate);
    this.dpicker['_datepicker']['_elementRef'].nativeElement.value
}

Working Example

【讨论】:

  • 感谢您的帮助。但仍然 24/7/1999 它不起作用输出 null 和 date 如果尝试 12/6/1987 bsdatepicker 转换为 06-Dec-1987 但我需要 12-dec-1987
  • 根据给定的日期格式(dd-mmm-yyyy)。如果您在 1987 年 12 月 6 日键入此值。它只转换正确
  • 这里的问题是用户可以输入 24/7/1986 我们应该通过元素 ref 得到 24/7/1986
  • 我不需要更改格式值完成 bsdatepicker,我需要文本框值 bsdatepicker 更改日期格式,这就是为什么我不能使用 elementref 中的 texbox 值
  • 我认为,可以在 bsdatepicker 中设置动态日期格式
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多