可以将日期类型的组件属性绑定到类型设置为datetime-local的HTML5输入?

在我的组件中,我有一个特性:

public filterDateFrom: Date;

在我的模板中,我有一个输入定义为:

<input type="datetime-local" [(ngModel)]="filterDateFrom" />

但绑定不起作用.

推荐答案

Demo Plnkr

您可以使用以下格式绑定到日期:yyyy-MM-ddTHH:mm,也可以从date.toISOString().slice(0,16)获得(切片删除分钟后的时间部分).

@Component({
    selector: 'app',
    template: `<input type="datetime-local" [value]="date" 
          (change)="date=$event.target.value" /> {{date}}` 
})
export class AppComponent {
    date: string;
    constructor() {
        this.date = new Date().toISOString().slice(0, 16);
    }
}

请记住,date.toISOString()将返回与当地时间的日期偏移.您也可以自己构造日期字符串:

private toDateString(date: Date): string {
    return (date.getFullYear().toString() + '-' 
       + ("0" + (date.getMonth() + 1)).slice(-2) + '-' 
       + ("0" + (date.getDate())).slice(-2))
       + 'T' + date.toTimeString().slice(0,5);
}

如果希望能够将select绑定到Date模型,可以使用它来构建自定义日期组件:

@Component({
    selector: 'my-date',
    events: ['dateChange'],
    template: `<input type="datetime-local" [value] = "_date" 
             (change) = "onDateChange($event.target.value)" />`
})
export class MyDate{
    private _date: string;
    @Input() set date(d: Date) {
        this._date = this.toDateString(d);
    }
    @Output() dateChange: EventEmitter<Date>;
    constructor() {
        this.date = new Date();
        this.dateChange = new EventEmitter();       
    }

    private toDateString(date: Date): string {
        return (date.getFullYear().toString() + '-' 
           + ("0" + (date.getMonth() + 1)).slice(-2) + '-' 
           + ("0" + (date.getDate())).slice(-2))
           + 'T' + date.toTimeString().slice(0,5);
    }

    private parseDateString(date:string): Date {
       date = date.replace('T','-');
       var parts = date.split('-');
       var timeParts = parts[3].split(':');

      // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
      return new Date(parts[0], parts[1]-1, parts[2], timeParts[0], timeParts[1]);     // Note: months are 0-based

    }

    private onDateChange(value: string): void {
        if (value != this._date) {
            var parsedDate = this.parseDateString(value);

            // check if date is valid first
            if (parsedDate.getTime() != NaN) {
               this._date = value;
               this.dateChange.emit(parsedDate);
            }
        }
    }
}

组件的用户将绑定到具有双向模型绑定的Date个模型:

@Component({
    selector: 'my-app',
    directives: [MyDate],
    template: '<my-date [(date)]="date"></my-date>  {{date}}' 
})
export class AppComponent {
    @Input() date: Date;
    constructor() {
        this.date = new Date();
    }
}

或者,如果要避免自定义标记,请将组件重写为指令:

<input type="datetime-local" [(date)]="date" />

Demo Plnkr with Directive

Typescript相关问答推荐

在React中实现具有独立页面的嵌套路径的最佳实践是什么?

需要使用相同组件重新加载路由变更数据—React TSX

将值添加到具有不同类型的对象的元素

Angular 行为:属性类型从SignalFunction更改为布尔

使某些(嵌套)属性成为可选属性

在分配给类型的只读变量中维护const的类型

如何在Reaction Query Builder中添加其他字段?

AngularJS服务不会解析传入的Json响应到管道中的模型

从泛型类型引用推断的文本类型

是否可以判断某个类型是否已合并为内部类型?

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

Angular 自定义验证控件未获得表单值

在Cypress中,是否可以在不标识错误的情况下对元素调用.Click()方法?

如何使这种一对一关系在旧表上起作用?

接口中可选嵌套属性的类型判断

Typescript 是否可以区分泛型参数 void?

我可以在 Typescript 中重用函数声明吗?

带有 Select 器和映射器的Typescript 泛型

TS 条件类型无法识别条件参数

如何编写一个接受 (string|number|null|undefined) 但只返回 string 且可能返回 null|undefined 的函数?