【问题标题】:angular material datepicker output角度材料日期选择器输出
【发布时间】:2019-02-20 10:06:05
【问题描述】:

我查看了有关 Angular 材料日期选择器的文档,但无法更改输出。我在 stackoverflow 上使用了一些答案,但它们仍然只更改了显示的格式。正如您在图片中看到的,我无法将日期选择器输出从 2 月 11 日星期一更改为日期选择器输入字段 11-02-2019 example 中的格式。如何让它输出 datepicker 输入行而不是 Mon Feb 11 上显示的格式并删除附加的时间值。

到目前为止,这是我的 component.ts:

import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import {DateAdapter,NativeDateAdapter,MAT_DATE_FORMATS,MAT_DATE_LOCALE} from "@angular/material/core";
import * as moment from "moment";
import { DatabaseService } from 'src/app/database.service'
import { Observable } from 'rxjs';
const CUSTOM_DATE_FORMATS = {parse: {dateInput: { month: "short", year: "numeric", day: "numeric" }},
display: {
dateInput: "input",
monthYearLabel: { year: "numeric", month: "short" },
dateA11yLabel: { year: "numeric", month: "long", day: "numeric" },
monthYearA11yLabel: { year: "numeric", month: "long" }}};
const dateFormat = "DD-MM-YYYY";
class AppDateAdapter extends NativeDateAdapter {format(date: Date, displayFormat: Object): string {
if (displayFormat === "input") {return moment(date).format(dateFormat);}else {
  return date.toDateString();}}}
@Component({
  selector: 'app-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.css'],

  providers: [
     { provide: MAT_DATE_FORMATS, useValue: CUSTOM_DATE_FORMATS },
     { provide: DateAdapter, useClass: AppDateAdapter }
]
})
export class DashboardComponent implements OnInit {
get data(): string {
return this.databaseService.serviceData;
}
set data(value: string) { 
this.databaseService.serviceData = (value);  } 

@Input() placeholder;
@Output() onFilter: EventEmitter<any> = new EventEmitter<any>();
@Input() selectedValue;
@Output() selectedValueChange: EventEmitter<any> = new EventEmitter<any>();

private _selectedValue;

constructor(public databaseService: DatabaseService){}

ngOnInit() {
this._selectedValue = this.data;}

onChange($event) {
this.selectedValue = this.updateDate($event.value);
this.onFilter.emit(this.data);}

updateDate(date) {
let formatedDate;
if (date !== undefined) {
  formatedDate = moment(date).format(dateFormat);
}
this.selectedValueChange.emit(formatedDate);
return formatedDate;
   }

}

还有我的html:

<div style="top: 50%; position: absolute;">
  <mat-form-field class="datepicker">
    <input matInput [matDatepicker]="picker" [(ngModel)]= data>
    <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
    <mat-datepicker touchUi #picker></mat-datepicker>
  </mat-form-field>  
 <h2 >Data from A: {{ data }} </h2> 
 <input [(ngModel)] = data/>
 <a [routerLink]="['/**']">Go to B</a> 
</div>

【问题讨论】:

    标签: angular datepicker angular-material


    【解决方案1】:

    Material DatePicker 提供的输出对象已经携带了你需要的所有信息,你只需要正确打印出来。

    试试:

        <h2 >Data from A: {{data.format("DD-MM-YYYY")}} </h2> 
    

    代替你的:

        <h2 >Data from A: {{ data }} </h2> 
    

    可以肯定的是,我已经在一个工作项目上对此进行了测试,并且它可以正常工作。

    编辑:

    如果您需要在更改日期时执行某些程序,您需要在 datePicker 输入上设置一个“监听器”(dateChange),这样:

       ...
        <input matInput [matDatepicker]="picker" [(ngModel)]= data (dateChange)="yourFunctionName($event.value)">
       ...
    

    $event.value 的保存值为“data”,因此,此时,您可以删除 [(ngModel)]= 数据(在 Angular 6 中已弃用)

    然后,一旦设置了侦听器,您就可以在您的打字稿文件中创建处理日期更改的函数。

    yourFunctionName(event: any) {
        const data = event;
        const formattedDate = data.getDate() + '-' + (data.getMonth() + 1) + '-' + data.getFullYear();
        ... do your operations with formattedDate ...
    }
    

    现在您可以在“formattedDate”变量中正确格式化日期。
    如果您需要在此函数之外访问组件中的这些数据,您可以声明一个外部变量(如您已经创建的“数据”)并在函数内部使用 this.data 语法引用它

    data: string;
    
    yourFunctionName(event: any) {
            ...
            this.data = data.getDate() + '-' + (data.getMonth() + 1) + '-' + data.getFullYear();
            ...
        }
    

    您可以使用“.getDate()”和朋友或使用 Moment 来格式化您的日期。

    【讨论】:

    • 感谢您的帮助。我相信它对你有用,但是当我尝试用 {{data.format("DD-MM-YYYY")}} 替换 {{data}} 并且它破坏了日历并且 h2 标签显示为 Data from A: 但它的值是空白的。输入字段仍在保存到数据库服务中将数据传递给其他组件,但现在没有日历 + 没有输出更改。我觉得它应该像添加 .format('format structure') 一样简单
    • 尝试使用经典的javascript语法日期:{{data.getDate() + "-" + (data.getMonth() + 1) + "-" + data.getFullYear()}} 如果这不起作用,你能告诉我哪个类型是“数据”变量,这样我就可以了解哪个函数 ara 可用于提取您需要的信息。
    • 再次感谢西莫。那行得通,但是您知道如何以这种格式将其存储在我的服务中的变量中。我想以该格式传递它,以用于在我的 firebase 数据库中引用,以使用该特定字符串格式获取数据。因此,当用户单击日历时,它将存储日期,例如 2-2-19,并将其传递给将 var 插入其中的下一个组件,例如 db.list('documents/2-2-19' )
    • "data" 变量已经存储了日期信息,与 ngModel 绑定,每次选择不同的日期,"data" 变量都会刷新,您只需正确格式化输出即可。但是,如果我正确理解了您的最后一条评论,您需要在日期更改时存储此结果,因此您需要一个事件来告诉您用户已设置新日期对吗?
    • 在这种情况下,当日期选择器中的值被修改时,您可以在输入中使用 (dateChange) 来触发函数,如果您需要有关让我知道我将更新我的答案的额外信息,请解释dateChange 的实现在评论中有点不方便。
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多