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

MoS*_*ikh 43 typescript angular2-forms angular

尝试设置表单但由于某种原因,尽管使用[(ngModel)],但我的html中的Date输入并未绑定到对象的日期值

HTML:

<input type='date' #myDate [(ngModel)]='demoUser.date'/><br>
Run Code Online (Sandbox Code Playgroud)

表单组件:

export class FormComponent {
    demoUser = new User(0, '', '', '', '', new Date(), '', 0, [], []);  
}
Run Code Online (Sandbox Code Playgroud)

用户类:

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[]
    ){

    }
}
Run Code Online (Sandbox Code Playgroud)

测试输出显示当前"新"Date作为对象的值,但输入不更新User对象的日期值或反映该值,表明这两个双向绑定都不起作用.非常感谢帮助.

Bou*_*ine 69

Angular 2,4和5:

最简单的方法:plunker

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

  • 它给出错误:在动作表达式中不能有管道 (6认同)
  • 你的解决方案有bug.单击x以清除日期,然后单击mm并开始键入以下序列:1 - 1 - 1 - 1 - 2 - 0 - 1 - 7以生成11/11/2017,结果为:mm/dd/0017,而不是11/11/2017 (5认同)
  • 快速而简单,但它将本地化​​抛到了窗外. (3认同)

hak*_*any 46

而不是[(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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢,用于小改动:`(input)="demoUser.date = $ event.target.valueAsDate"` (4认同)

Mat*_*imi 8

在您的组件中

let today: Date;

ngOnInit() {
  this.today = new Date().toISOString().split('T')[0];
}
Run Code Online (Sandbox Code Playgroud)

并在你的HTML中

<input name="date" [(ngModel)]="today" type="date" required>
Run Code Online (Sandbox Code Playgroud)


M R*_*eez 8

使用日期管道

> // 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, [], []);  
}
Run Code Online (Sandbox Code Playgroud)


小智 7

在.ts中:

today: Date;

constructor() {  

    this.today =new Date();
}
Run Code Online (Sandbox Code Playgroud)

.html:

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


Shi*_*vam 6

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

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

注意:如果日期字符串包含“Z”,那么要实现上述解决方案,您需要从日期中删除“Z”字符。

有关更多详细信息,请访问mozilla 文档上的此链接。

  • `input type="date"` 仍然有效。除了 IE 和 Safari 之外,所有浏览器都支持它。`type="datetime-local"` 是一种完全不同的输入类型,Firefox 也不支持:[link](https://caniuse.com/#feat=input-datetime) (2认同)

And*_*ich 5

Angular 2完全忽略了type=date.如果您更改类型,text您将看到您input具有双向绑定.

<input type='text' #myDate [(ngModel)]='demoUser.date'/><br>
Run Code Online (Sandbox Code Playgroud)

这是一个非常糟糕的建议,更好的一个遵循:

我最初使用的项目jQuery.所以,我现在正在使用jQuery datepicker,希望有角度的团队将解决原始问题.此外,它还是一个更好的替代品,因为它具有跨浏览器支持.仅供参考,input=dateFirefox中不起作用.

好建议:很少有很好的Angular2 datepickers: