DatePicker 更改自定义标题中的视图

Posted

技术标签:

【中文标题】DatePicker 更改自定义标题中的视图【英文标题】:DatePicker change the view in the custom header 【发布时间】:2019-05-25 07:11:21 【问题描述】:

我正在使用带有自定义标题的 Angular Material 的 datePicker,并希望在我的 datepicker 标题中添加一个按钮,以便我转到 datepicker 的“多年”视图。

我尝试更改 startView,但这只会在我启动 datepicker 选择时更改视图。

不幸的是,我发现没有任何功能可以让我选择日期选择器的视图。

html

<mat-form-field class="px-3">
  <input matInput [matDatepicker]="datePicker"
                  placeholder="Sélectionnez une période"
                  formControlName="selectedPeriod"
                  readonly
                  [min]="minDate" [max]="maxDate"
                  [matDatepickerFilter]="filterDate">
  <mat-datepicker-toggle matSuffix [for]="datePicker"></mat-datepicker-toggle>
  <mat-datepicker #datePicker touchUi
                  startView="multi-year"
                  (yearSelected)="chosenYearHandler($event)"
                  (monthSelected)="chosenMonthHandler($event, datePicker)"
                  [calendarHeaderComponent]="exampleHeader">
  </mat-datepicker>
</mat-form-field>

日期选择器的标题:

<div class="example-header">
 <button mat-icon-button class="example-double-arrow" 
         (click)="previousClicked()">
   <mat-icon>arrow_back</mat-icon>
 </button>
 <span class="example-header-label">periodLabel</span>
 <button mat-icon-button class="example-double-arrow" 
         (click)="closeClicked()">
   <mat-icon>close</mat-icon>
 </button>

export class ExampleHeader<Moment> implements OnDestroy 

 private destroyed = new Subject<void>();
 @ViewChildren('datePicker') datePicker: MatDatepicker<Moment>;

 constructor(@Host() private calendar: MatCalendar<Moment>,
          private dateAdapter: DateAdapter<Moment>,
          private datepicker: MatDatepicker<Moment>,
          @Inject(MAT_DATE_FORMATS) private dateFormats: MatDateFormats,
          cdr: ChangeDetectorRef) 
              calendar.stateChanges
                  .pipe(takeUntil(this.destroyed))
                  .subscribe(() => cdr.markForCheck()); 

ngOnDestroy() 
  this.destroyed.next();
  this.destroyed.complete();


get periodLabel() 
  return this.dateAdapter
    .format(this.calendar.activeDate, this.dateFormats.display.monthYearA11yLabel)
    .toLocaleUpperCase();


//Back to the "multi-year" view of the datePicker
previousClicked() 
  this.datepicker.startView="multi-year"; //Does not match the demand


closeClicked() 
  this.datepicker.close();

演示:

就像在演示中一样,我想回到之前的视图。

我为我的 datePicker 做了一个StackBlitz HERE。 (L.214)

提前谢谢你!

【问题讨论】:

【参考方案1】:

您需要将其更改为以下内容:

previousClicked() 
  this.calendar.currentView = 'multi-year';

请参阅 thisstackblitz 了解工作示例。

【讨论】:

链接好像失效了 查看昆汀在下面发布的代码+ Stackblitz,他的 Stackblitz 仍然有效。【参考方案2】:

感谢 F*** Küng!

这是结果和代码:

  previousViewClicked() 
    this.calendar.currentView = 'multi-year';
  

  previousMultiYearClicked(mode: 'year') 
    this.calendar.activeDate = mode === 'year' ?
        this.dateAdapter.addCalendarYears(this.calendar.activeDate, -10) : null;
  

  nextMultiYearClicked(mode: 'year') 
    this.calendar.activeDate = mode === 'year' ?
        this.dateAdapter.addCalendarYears(this.calendar.activeDate, 10) : null;
  

StackBlitz HERE

【讨论】:

以上是关于DatePicker 更改自定义标题中的视图的主要内容,如果未能解决你的问题,请参考以下文章

自定义 WPF DatePicker 掩码

Swift:使用 UIPicker 自定义 DatePicker

如何更改 Xamarin 表单中的 DatePicker Ok 和 Cancel 按钮文本?

更改 uitableviewcell 中的自定义附件视图?

javafx datepicker如何自定义

在iOS 12中的UIDatePicker中自定义背景和文本颜色