我在Angular 5项目中使用ngx-bootstrap
。
有谁知道如何将Datepicker和Timepicker结合起来?当我选择一个时间它总是包括今天的日期。我想使用Datepicker
中选择的日期。
如果可能的话,更好的方法是将它放在同一型号上。
我的想法是将其传递给webapi
,它接受datetime
属性(c#)。
提前致谢!
答案 0 :(得分:4)
Datepicker和Timepicker的值都是Date类型。
因此,您可以在将结果发送到服务器之前简单地组合它们的值。
例如,假设您将Datepicker的值存储在date
变量中,并将Timepicker存储在time
变量中,您可以执行以下操作:
date.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
现在date
包含Datepicker中的日期和Timepicker的时间,因此您现在可以将date
发送到服务器(以您需要的任何格式)。
答案 1 :(得分:0)
或者,您可以将日期和时间选择器组合到自定义的ControlValueAccessor
中,并消除对每个项目组合单独的日期和时间值的需要。
以下代码在以下意义上是 opinionized :
但是它很容易修改,应该为完成此任务奠定良好的基础。
// datetime-picker.component.ts
import { Component, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor, FormGroup, FormControl, Validators } from '@angular/forms';
interface DateAndTime {
date: Date;
time: Date;
}
@Component({
selector: 'datetime-picker',
templateUrl: './datetime-picker.component.html',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DatetimePickerComponent),
multi: true
}]
})
export class DatetimePickerComponent implements ControlValueAccessor {
private onChange: (value: Date) => void;
public datetime: Date = new Date();
public form: FormGroup;
constructor() {
this.form = new FormGroup({});
this.form.addControl('date', new FormControl(this.datetime, Validators.required));
this.form.addControl('time', new FormControl(this.datetime, Validators.required));
this.onChanges();
}
private onChanges(): void {
// listen for changes, and recombinate internal datetime when they occur
this.form.valueChanges.subscribe((f: DateAndTime) => this.setDatetime(f));
}
private setDatetime(d: DateAndTime) {
this.datetime.setFullYear(d.date.getFullYear(), d.date.getMonth(), d.date.getDate());
this.datetime.setHours(d.time.getHours(), d.time.getMinutes(), 0, 0);
this.onChange(this.datetime);
}
/*
* Control Value Accessor
*/
writeValue(value: Date): void {
// This method is called with the `null` value when the form resets.
// A component's responsibility is to restore to the initial state.
if (value === null) {
value = new Date();
}
this.datetime = value;
}
registerOnChange(fn: any): void {
this.onChange = fn;
}
registerOnTouched(fn: any): void { }
setDisabledState?(isDisabled: boolean): void { }
}
// datetime-picker.component.html
<div class="d-flex" [formGroup]="form">
<div class="flex-grow-1 pr-3">
<input type="text" class="form-control" formControlName="date" bsDatepicker />
</div>
<div>
<timepicker formControlName="time" [showSpinners]="false"></timepicker>
</div>
</div>