Skip to content

Commit 4a33dfb

Browse files
author
Matt Lewis
committed
docs(demos): make date-time-picker work with ngModel and reactive forms
Closes #294
1 parent 7a28511 commit 4a33dfb

File tree

2 files changed

+46
-33
lines changed

2 files changed

+46
-33
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import {
2-
Component,
3-
Input,
4-
Output,
5-
EventEmitter,
6-
SimpleChanges,
7-
OnChanges
8-
} from '@angular/core';
1+
import { ChangeDetectorRef, Component, forwardRef, Input } from '@angular/core';
92
import {
103
getSeconds,
114
getMinutes,
@@ -21,6 +14,13 @@ import {
2114
setYear
2215
} from 'date-fns';
2316
import { NgbDateStruct, NgbTimeStruct } from '@ng-bootstrap/ng-bootstrap';
17+
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
18+
19+
export const DATE_TIME_PICKER_CONTROL_VALUE_ACCESSOR: any = {
20+
provide: NG_VALUE_ACCESSOR,
21+
useExisting: forwardRef(() => DateTimePickerComponent),
22+
multi: true
23+
};
2424

2525
@Component({
2626
selector: 'mwl-demo-utils-date-time-picker',
@@ -43,44 +43,57 @@ import { NgbDateStruct, NgbTimeStruct } from '@ng-bootstrap/ng-bootstrap';
4343
</div>
4444
</div>
4545
</form>
46-
<ngb-timepicker [(ngModel)]="timeStruct" (ngModelChange)="updateTime()" [meridian]="true"></ngb-timepicker>
46+
<ngb-timepicker
47+
[(ngModel)]="timeStruct"
48+
(ngModelChange)="updateTime()"
49+
[meridian]="true">
50+
</ngb-timepicker>
4751
`,
4852
styles: [
4953
`
5054
.form-group {
5155
width: 100%;
5256
}
5357
`
54-
]
58+
],
59+
providers: [DATE_TIME_PICKER_CONTROL_VALUE_ACCESSOR]
5560
})
56-
export class DateTimePickerComponent implements OnChanges {
61+
export class DateTimePickerComponent implements ControlValueAccessor {
5762
@Input() placeholder: string;
5863

59-
@Input() date: Date;
60-
61-
@Output() dateChange: EventEmitter<Date> = new EventEmitter();
64+
date: Date;
6265

6366
dateStruct: NgbDateStruct;
6467

6568
timeStruct: NgbTimeStruct;
6669

6770
datePicker: any;
6871

69-
ngOnChanges(changes: SimpleChanges): void {
70-
if (changes['date']) {
71-
this.dateStruct = {
72-
day: getDate(this.date),
73-
month: getMonth(this.date) + 1,
74-
year: getYear(this.date)
75-
};
76-
this.timeStruct = {
77-
second: getSeconds(this.date),
78-
minute: getMinutes(this.date),
79-
hour: getHours(this.date)
80-
};
81-
}
72+
private onChangeCallback: (date: Date) => void = () => {};
73+
74+
constructor(private cdr: ChangeDetectorRef) {}
75+
76+
writeValue(date: Date): void {
77+
this.date = date;
78+
this.dateStruct = {
79+
day: getDate(date),
80+
month: getMonth(date) + 1,
81+
year: getYear(date)
82+
};
83+
this.timeStruct = {
84+
second: getSeconds(date),
85+
minute: getMinutes(date),
86+
hour: getHours(date)
87+
};
88+
this.cdr.detectChanges();
89+
}
90+
91+
registerOnChange(fn: any): void {
92+
this.onChangeCallback = fn;
8293
}
8394

95+
registerOnTouched(fn: any): void {}
96+
8497
updateDate(): void {
8598
const newDate: Date = setYear(
8699
setMonth(
@@ -89,7 +102,7 @@ export class DateTimePickerComponent implements OnChanges {
89102
),
90103
this.dateStruct.year
91104
);
92-
this.dateChange.next(newDate);
105+
this.onChangeCallback(newDate);
93106
}
94107

95108
updateTime(): void {
@@ -100,6 +113,6 @@ export class DateTimePickerComponent implements OnChanges {
100113
),
101114
this.timeStruct.hour
102115
);
103-
this.dateChange.next(newDate);
116+
this.onChangeCallback(newDate);
104117
}
105118
}

demos/demo-modules/kitchen-sink/template.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,15 @@ <h3>
149149
</td>
150150
<td>
151151
<mwl-demo-utils-date-time-picker
152-
[(date)]="event.start"
153-
(dateChange)="refresh.next()"
152+
[(ngModel)]="event.start"
153+
(ngModelChange)="refresh.next()"
154154
placeholder="Not set">
155155
</mwl-demo-utils-date-time-picker>
156156
</td>
157157
<td>
158158
<mwl-demo-utils-date-time-picker
159-
[(date)]="event.end"
160-
(dateChange)="refresh.next()"
159+
[(ngModel)]="event.end"
160+
(ngModelChange)="refresh.next()"
161161
placeholder="Not set">
162162
</mwl-demo-utils-date-time-picker>
163163
</td>

0 commit comments

Comments
 (0)