Angular 2 日期输入未绑定到日期值

Angular 2 Date Input not binding to date value

正在尝试设置表单,但出于某种原因,尽管使用了 [(ngModel)]

,我 html 中的日期输入并未绑定到对象的日期值

html:

<input type='date' #myDate [(ngModel)]='demoUser.date'/><br>

表单组件:

export class FormComponent {
    demoUser = new User(0, '', '', '', '', new Date(), '', 0, [], []);  
}

用户class:

export class User {
    constructor (
        public id: number,
        public email: string,
        public password: string,
        public firstName: string,
        public lastName: string,
        public date: Date,
        public gender: string,
        public weight: number,
        public dietRestrictions: string[],
        public fitnessGoals: string[]
    ){

    }
}

测试输出将当前 "new" 日期显示为对象的值,但输入不会更新用户对象的日期值或反映该值,这表明双向绑定均无效。将不胜感激。

Angular2完全忽略type=date。如果将类型更改为 text,您会看到 input 具有双向绑定。

<input type='text' #myDate [(ngModel)]='demoUser.date'/><br>

这是一个非常糟糕的建议,下面是更好的建议:

我的项目原来用的是jQuery。所以,我现在使用 jQuery datepicker,希望 angular 团队能解决原来的问题。它也是一个更好的替代品,因为它具有跨浏览器支持。仅供参考,input=dateFirefox 中不起作用。

好建议: 好的很少Angular2 datepickers:

您可以使用:

而不是 [(ngModel)]
// view
<input type="date" #myDate [value]="demoUser.date | date:'yyyy-MM-dd'" (input)="demoUser.date=parseDate($event.target.value)" />

// controller
parseDate(dateString: string): Date {
    if (dateString) {
        return new Date(dateString);
    }
    return null;
}

您也可以选择不使用parseDate函数。在这种情况下,日期将被保存为字符串格式,如“2016-10-06”,而不是 Date 类型(我没有尝试过这在操作数据或保存到数据库时是否会产生负面影响)。

Angular 2、4 和 5 :

最简单的方法:plunker

<input type="date" [ngModel] ="dt | date:'yyyy-MM-dd'" (ngModelChange)="dt = $event">

您可以使用一种变通方法,例如:

<input type='date' (keyup)="0" #myDate [(ngModel)]='demoUser.date'/><br>

在你的组件上:

 @Input public date: Date,

如果您使用的是现代浏览器,则有一个简单的解决方案。

首先,将模板变量附加到输入。

<input type="date" #date />

然后将变量传递给您的接收方法。

<button (click)="submit(date)"></button>

在您的控制器中,只需接受 HTMLInputElement 类型的参数 并在 HTMLInputElement 上使用 valueAsDate 方法。

submit(date: HTMLInputElement){
    console.log(date.valueAsDate);
}

然后您可以像正常日期一样操纵日期。

您还可以根据需要设置 <input [value]= "..."> 的值 通常会。

就个人而言,作为一个试图忠于单向数据流的人,我尽量避免在我的组件中进行双向数据绑定。

在你的组件中

let today: string;

ngOnInit() {
  this.today = new Date().toISOString().split('T')[0];
}

并在您的 html 文件中

<input name="date" [(ngModel)]="today" type="date" required>

根据HTML5,您可以使用 input type="datetime-local" 代替 input type="date".

它将允许 [(ngModel)] 指令从输入控件读取和写入值。

注意:如果日期字符串包含'Z'那么要实现上面的解决方案,你需要trim日期中的'Z'字符.

有关更多详细信息,请在 mozilla 文档上阅读此 link

使用DatePipe

> // ts file

import { DatePipe } from '@angular/common';

@Component({
....
providers:[DatePipe]
})

export class FormComponent {

constructor(private datePipe : DatePipe){}

    demoUser = new User(0, '', '', '', '', this.datePipe.transform(new Date(), 'yyyy-MM-dd'), '', 0, [], []);  
}

在 .ts 中:

today: Date;

constructor() {  

    this.today =new Date();
}

.html:

<input type="date"  
       [ngModel]="today | date:'yyyy-MM-dd'"  
       (ngModelChange)="today = $event"    
       name="dt" 
       class="form-control form-control-rounded" #searchDate 
>

在打字稿中 - app.component.ts 文件

export class AppComponent implements OnInit {
    currentDate = new Date();
}

在HTML输入字段

<input id="form21_1" type="text" tabindex="28" title="DATE" [ngModel]="currentDate | date:'MM/dd/yyyy'" />

它将在输入字段中显示当前日期。