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' ;
9
2
import {
10
3
getSeconds ,
11
4
getMinutes ,
@@ -21,6 +14,13 @@ import {
21
14
setYear
22
15
} from 'date-fns' ;
23
16
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
+ } ;
24
24
25
25
@Component ( {
26
26
selector : 'mwl-demo-utils-date-time-picker' ,
@@ -43,44 +43,57 @@ import { NgbDateStruct, NgbTimeStruct } from '@ng-bootstrap/ng-bootstrap';
43
43
</div>
44
44
</div>
45
45
</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>
47
51
` ,
48
52
styles : [
49
53
`
50
54
.form-group {
51
55
width: 100%;
52
56
}
53
57
`
54
- ]
58
+ ] ,
59
+ providers : [ DATE_TIME_PICKER_CONTROL_VALUE_ACCESSOR ]
55
60
} )
56
- export class DateTimePickerComponent implements OnChanges {
61
+ export class DateTimePickerComponent implements ControlValueAccessor {
57
62
@Input ( ) placeholder : string ;
58
63
59
- @Input ( ) date : Date ;
60
-
61
- @Output ( ) dateChange : EventEmitter < Date > = new EventEmitter ( ) ;
64
+ date : Date ;
62
65
63
66
dateStruct : NgbDateStruct ;
64
67
65
68
timeStruct : NgbTimeStruct ;
66
69
67
70
datePicker : any ;
68
71
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 ;
82
93
}
83
94
95
+ registerOnTouched ( fn : any ) : void { }
96
+
84
97
updateDate ( ) : void {
85
98
const newDate : Date = setYear (
86
99
setMonth (
@@ -89,7 +102,7 @@ export class DateTimePickerComponent implements OnChanges {
89
102
) ,
90
103
this . dateStruct . year
91
104
) ;
92
- this . dateChange . next ( newDate ) ;
105
+ this . onChangeCallback ( newDate ) ;
93
106
}
94
107
95
108
updateTime ( ) : void {
@@ -100,6 +113,6 @@ export class DateTimePickerComponent implements OnChanges {
100
113
) ,
101
114
this . timeStruct . hour
102
115
) ;
103
- this . dateChange . next ( newDate ) ;
116
+ this . onChangeCallback ( newDate ) ;
104
117
}
105
118
}
0 commit comments