【问题标题】:How to use datepicker popup in angular 2如何在角度 2 中使用日期选择器弹出窗口
【发布时间】:2016-07-19 15:31:43
【问题描述】:

我想在使用角度 2 的输入控件中使用日期选择器弹出窗口,当对输入控件进行模糊处理时,日期选择器弹出应该像引导日期选择器一样,我想在角度 2 中执行此操作,请建议我参考Angular 2 的日期选择器。

【问题讨论】:

    标签: angular


    【解决方案1】:

    我根据ng2-bootstrap datepicker 创建了自己的日期选择器弹出窗口。

    HTML

    <my-datepicker [dateModel]="endDate" [label]="'Startdatum'" ></my-datepicker>
    

    TypeScript 中的 Angular2-Component:

    import {Component, Input, Output, EventEmitter} from '@angular/core';
    import {DATEPICKER_DIRECTIVES} from 'ng2-bootstrap/components/datepicker';
    
    @Component({
        selector: 'my-datepicker',
        directives: [DATEPICKER_DIRECTIVES],
        template: `
          <label>{{label}}</label>
          <input [(ngModel)]="dateModel" class="form-control"     (focus)="showPopup()" />
          <datepicker class="popup" *ngIf="showDatepicker" [(ngModel)]="dateModel" [showWeeks]="true" (ngModelChange)="hidePopup($event)" ></datepicker>
      `,
        styles: [`
        .popup {
          position: absolute;
          background-color: #fff;
          border-radius: 3px;
          border: 1px solid #ddd;
          height: 251px;
        }
      `],
    })
    export class IsdDatepickerComponent {
        @Input()
        dateModel: Date;
        @Input()
        label: string;
        @Output()
        dateModelChange: EventEmitter<string> = new EventEmitter();
        private showDatepicker: boolean = false;
    
        showPopup() {
            this.showDatepicker = true;
        }
    
        hidePopup(event) {
            this.showDatepicker = false;
            this.dateModel = event;
            this.dateModelChange.emit(event)
        }
    }
    

    【讨论】:

    • 固体控制,@Christoph。
    • 完美!感谢分享
    • 能否请您更新 showWeeks 属性(它应该用 [] 括号括起来)。 Stackoverflow 不允许编辑少于 6 个字符:@
    • @AbuAbdullah 完成。
    • ng2-bootstrap 目前不附带组件。我错过了一些东西
    【解决方案2】:

    看看这个日期选择器,它是高度可配置的,它唯一的依赖是时刻。
    https://github.com/vlio20/ng2-date-picker

    【讨论】:

    • 另一个似乎有问题,这似乎效果更好,尽管我认为它需要一些 css 更改
    • 注意有一个材质样式类。并且 css 被构建为易于根据您的意愿设计样式
    • 我很难找到这个 css - 我可以看到一个更少的文件,但它似乎是空的。请让我知道我的无知:)
    • 请参考文档。你会在那里找到它。你看过演示吗?
    • 在demo的css页面可以看到,有样式,比如:".dp-calendar-nav-left[_ngcontent-ppw-0], .dp-calendar-nav- right[_ngcontent-ppw-0]{" 由 css 在角度组件中生成。我想我可以复制这个 css,从每行中删除方括号及其内容,然后使用它?
    【解决方案3】:

    只需使用 selectionDone 代替 ngModelChange 事件。 我在我的代码中使用:

        import {Component, Input, Output, EventEmitter} from '@angular/core';
    import {DATEPICKER_DIRECTIVES} from 'ng2-bootstrap/components/datepicker';
    
    @Component({
        selector: 'my-datepicker',
        directives: [DATEPICKER_DIRECTIVES],
        template: `
          <label>{{label}}</label>
          <input [(ngModel)]="dateModel" class="form-control"     (focus)="showPopup()" />
          <datepicker class="popup" *ngIf="showDatepicker" [(ngModel)]="dateModel" [showWeeks]="true" (selectionDone)="hidePopup($event)" ></datepicker>
      `,
        styles: [`
        .popup {
          position: absolute;
          background-color: #fff;
          border-radius: 3px;
          border: 1px solid #ddd;
          height: 251px;
        }
      `],
    })
    export class IsdDatepickerComponent {
        @Input()
        dateModel: Date;
        @Input()
        label: string;
        @Output()
        dateModelChange: EventEmitter<string> = new EventEmitter();
        private showDatepicker: boolean = false;
    
        showPopup() {
            this.showDatepicker = true;
        }
    
        hidePopup(event) {
            this.showDatepicker = false;
            this.dateModel = event;
            this.dateModelChange.emit(event)
        }
    }
    

    【讨论】:

    • 非常感谢下面的作者,他提出了这段代码的大部分内容。 ;)
    【解决方案4】:

    基于 Bootstrap 4 的 Angular 2 有一个新的、出色的 datepicker 实现:https://ng-bootstrap.github.io/#/components/datepicker

    它是一个完全原生的小部件,具有表单集成和非常灵活的自定义选项。

    【讨论】:

    • 唯一的事情是,它适用于引导程序 4。我还注意到,当您在日期选择器外部单击时,它不会自动关闭日期选择器。虽然我一直在关注它,但看起来很有趣,在 ng2-bootstrap 旁边(有一个 bootstrap3/4 版本)。
    • Bootstrap 4 仍然是 Alpha 版,虽然我期待它在今年春天发布,但我不推荐它用于大多数项目。
    【解决方案5】:

    这是我基于 Christophs 回答的实现。我正在使用两种方式绑定。组件将日期作为字符串 yyyy-mm-dd 发出以保存在服务器上。但它将组件内的日期显示为字符串 dd-mm-yyyy 。方便跨浏览器显示

     <datepicker-popup [(dateModel)]="serverDate"></datepicker-popup>
    

    ts:

    import {Component, Input, Output, EventEmitter, OnInit} from '@angular/core';
    import {DatePickerComponent} from 'ng2-bootstrap/datepicker';
    
    @Component({
    selector: 'datepicker-popup',
    template: `
      <input type="text" [(ngModel)]="_dateModel" class="form-control" (click)="openPopup()">
      <datepicker class="popup"
          [hidden]="!showPopup"
          [(ngModel)]="dateModelObj"
          [showWeeks]="true"
          (ngModelChange)="closePopup($event)" >
      </datepicker>
    
    
     `,
        styles: [`
        .popup {
          position: absolute;
          background-color: #fff;
          border-radius: 3px;
          border: 1px solid #ddd;
          height: 251px;
        }
      `],
    })
    export class DatepickerPopupComponent implements OnInit{
        @Input() dateModel: string;
        @Output()  dateModelChange: EventEmitter<string> = new EventEmitter();
        showPopup: boolean = false;
        _dateModel: string;
        dateModelObj: any;
    
    ngOnInit() {
        this.dateModelObj = new Date(this.dateModel)
    }
    
    openPopup() {
        this.showPopup = true;
    }
    
    closePopup(event) {
        this.showPopup = false;
        this._dateModel = this.DDMMYYYY(event);
        this.dateModelChange.emit(this.YYYYMMDD(event))
    }
    
    YYYYMMDD(date):string {
        if (!date) return null;
        return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
    };
    
    DDMMYYYY(date):string {
        if (!date) return null;
        return date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getFullYear();
    };
    

    }

    【讨论】:

      【解决方案6】:

      试试这个, 前置要求ng2-bootstrap

      在您的应用模块中导入日期选择器模块

      import { DatepickerModule } from 'ng2-bootstrap';
      

      应用日期选择器

      <app-datepicker name="date" [(ngModel)]="driver.dateOfBirth" [placeholder]="'Date of Birth'" [dateFormat]="'dd-MM-yyyy'" ngDefaultControl required></app-datepicker>
      

      datepicker.component.ts

      import { Component, ViewChild, Input, Output, EventEmitter, ElementRef, Renderer } from '@angular/core';
      import { DatePipe } from '@angular/common';
      
      @Component({
          selector: 'app-datepicker',
          templateUrl: './datepicker.component.html',
          styleUrls: ['./datepicker.component.css']
      })
      
          export class DatepickerComponent {
              public inputHeight: String;
      
              @ViewChild('tasknote') input: ElementRef;
              @Input()
              ngModel: String;
              @Input()
              label: string;
              @Input()
              dateFormat: string;
              @Input()
              placeholder: string;
              @Output()
              ngModelChange: EventEmitter<string> = new EventEmitter();
      
              private showDatepicker: boolean = false;
      
              constructor(public element: ElementRef) {
              }
      
              showPopup(element) {
                  this.inputHeight = this.element.nativeElement.querySelector('input').getBoundingClientRect().height + 'px';
                  this.showDatepicker = true;
              }
      
              hidePopup(event) {
                  this.showDatepicker = false;
                  if (event) {
                      var date = new DatePipe('en-us').transform(event, this.dateFormat || 'dd/MM/yyyy');
                      this.ngModel = date;
                      this.ngModelChange.emit(date);
                  }
              }
          }
      

      datepicker.component.html

      <div style="position: relative;">
          <label [ngClass]="{'hide': !label}">{{label}}</label>
          <input #tasknote name="date-picker" [(ngModel)]="ngModel" (focus)="showPopup($elem)" placeholder="{{placeholder}}" required/>
          <datepicker class="popup" [ngClass]="{'hide': !showDatepicker}" [(ngModel)]="date" [showWeeks]="true" (selectionDone)="hidePopup($event)"
              [ngStyle]="{'bottom': inputHeight}"></datepicker>
      </div>
      

      datepicker.component.css

      .popup {
            position: absolute;
            background-color: #fff;
            border-radius: 3px;
            border: 1px solid #ddd;
            height: 251px;
            color: #000;
            right: 0px;
          }
      .hide {
           display:none;
      }
      

      【讨论】:

        【解决方案7】:

        您可以使用提供日期选择器组件的 ng2-boostrap 项目:

        <datepicker [(ngModel)]="date" showWeeks="true"></datepicker>
        

        查看项目页面:

        有关在 SystemJS 配置中配置 ng2-bootstrap(和 moment 库)的方法,请参阅此问题:

        【讨论】:

        • 这在 ng2-bootstrap 中还不能开箱即用。 (日期选择器作为弹出窗口)
        • @lexith 是正确的 ng2-bootstrap 还没有工作。
        • 我确认 ng2-bootstrap 在 Angular2 rc5 上不起作用,它不断抛出奇怪的错误消息。
        • 虽然您可以让 ng2-bootstrap DatePicker 像弹出窗口一样工作,但我发现 ng2-bootstrap 项目有些不稳定并且缺少文档。
        • ng2-bootstrap 日期选择器仍然没有弹出版本,只有内联
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多