Angular 如何在matDatepicker中转换窗体控件的历元格式
我有一个日期字段,其中保存了一个历元字符串。我想使用angular material date picker来更改日期,这可以通过以下方式进行转换:Angular 如何在matDatepicker中转换窗体控件的历元格式,angular,datepicker,angular-material,epoch,mat-datepicker,Angular,Datepicker,Angular Material,Epoch,Mat Datepicker,我有一个日期字段,其中保存了一个历元字符串。我想使用angular material date picker来更改日期,这可以通过以下方式进行转换: //convert matDatepicker timestamp format to epoch and save var newDOB = new Date(privateUser.date_of_birth).getTime().toString(); privateUser.date_of_birth = newDOB; 但是,在将其存储
//convert matDatepicker timestamp format to epoch and save
var newDOB = new Date(privateUser.date_of_birth).getTime().toString();
privateUser.date_of_birth = newDOB;
但是,在将其存储到数据库之前,当尝试在日期选择中显示它作为默认日期时,我不太确定如何恢复它
这是我目前的代码
<div *ngIf="(userPrivate$ | async) as userPrivate">
<form (ngSubmit)="updateUser(user, userPrivate)">
<mat-form-field >
<input matInput type="text" [(ngModel)]="user.username" name="username" placeholder="Username">
</mat-form-field >
<mat-form-field >
<input matInput [matDatepicker]="dp" placeholder="Date of Birth" [(ngModel)]="userPrivate.date_of_birth" name="date_of_birth">
<mat-datepicker-toggle matSuffix [for]="dp"></mat-datepicker-toggle>
<mat-datepicker #dp >
</mat-datepicker>
</mat-form-field>
</form>
</div>
我该如何处理这个问题,以便我可以将日期输入显示为默认的出生日期值?当您的日期选择器中的日期格式与您自己的数据结构不同时,通常有两种选择:1)以某种方式告诉日期选择器组件将其数据结构转换为您的数据结构,这通常是通过传递适配器类(2)来完成的,让datePicker将自己的数据格式传递给表单或模型,并且仅在发布表单或设置表单值时手动转换 使用适配器 实际上,material datepicker确实为您提供了提供适配器的可能性,其用法在 手动转换 手动转换时,您必须执行从数据结构到datepickers结构的转换,以设置初始值以及父组件更新表单值。每当你想保存表单中的数据时,你必须进行反向转换 因此,您不必以任何方式将转换方法添加到模板中,在submit方法中进行转换。 在您的示例中,绝对错误的是
[formControl]
需要的是角度表单控件,而不是值(本例中的日期本身)
就我个人而言,我会选择适配器解决方案,因为这样转换逻辑就不会分散,而是集中到特定的类,这也更容易测试
完全无关的音符
通常,尽量不要在值绑定中调用方法,例如
(为了简洁起见,省略了一些属性)
这些方法在每次更改检测时都会被调用(这可能非常频繁,特别是如果您不使用ChangeDetectionStrategy.onPush
),因此每次更改检测时都会进行转换,即使源值没有更改
在这些绑定方法中很容易隐藏复杂的计算,这可能会大大降低应用程序的速度
相反,只在源值更改时进行计算,将结果存储在组件的字段中,并在模板中绑定该字段
<mat-form-field >
<input matInput [matDatepicker]="dp" placeholder="Date of Birth" [formControl]="userPrivate.date_of_birth" [(ngModel)]="userPrivate.date_of_birth" name="date_of_birth">
<mat-datepicker-toggle matSuffix [for]="dp"></mat-datepicker-toggle>
<mat-datepicker #dp >
</mat-datepicker>
</mat-form-field>
<mat-form-field >
<input matInput [matDatepicker]="dp" placeholder="Date of Birth" [formControl]="getDate(userPrivate.date_of_birth)" [(ngModel)]="userPrivate.date_of_birth" name="date_of_birth">
<mat-datepicker-toggle matSuffix [for]="dp"></mat-datepicker-toggle>
<mat-datepicker #dp >
</mat-datepicker>
</mat-form-field>
getDate(date){
// convert Epoch time to timestamp format
var newDate= new Date(date).getTime();
return newDate;
}