11import { ChangeDetectionStrategy , Component , EventEmitter , Input , Output } from '@angular/core' ;
2+ import { ControlValueAccessor , NG_VALUE_ACCESSOR } from '@angular/forms' ;
23import { MatSlideToggleChange } from '@angular/material/slide-toggle' ;
34import { ToggleSwitchSize } from './toggle-switch-size' ;
45
@@ -10,33 +11,69 @@ import { ToggleSwitchSize } from './toggle-switch-size';
1011 <div class="toggle-switch">
1112 <mat-slide-toggle
1213 color="primary"
13- [checked]="this.checked "
14+ [checked]="this.isChecked "
1415 [ngClass]="{ 'small-slide-toggle': this.size === '${ ToggleSwitchSize . Small } ', disabled: this.disabled }"
15- [disabled]="this.disabled "
16+ [disabled]="this.isDisabled "
1617 (change)="this.onToggle($event)"
1718 >
1819 <div class="label">{{ this.label }}</div>
1920 </mat-slide-toggle>
2021 </div>
21- `
22+ ` ,
23+ providers : [
24+ {
25+ provide : NG_VALUE_ACCESSOR ,
26+ useExisting : ToggleSwitchComponent ,
27+ multi : true
28+ }
29+ ]
2230} )
23- export class ToggleSwitchComponent {
31+ export class ToggleSwitchComponent implements ControlValueAccessor {
2432 @Input ( )
25- public checked ?: boolean ;
33+ public label ?: string = '' ;
2634
2735 @Input ( )
28- public label ?: string = '' ;
36+ public set checked ( checked : boolean | undefined ) {
37+ this . isChecked = checked ?? false ;
38+ }
2939
3040 @Input ( )
31- public disabled ?: boolean ;
41+ public set disabled ( disabled : boolean | undefined ) {
42+ this . isDisabled = disabled ?? false ;
43+ }
3244
3345 @Input ( )
3446 public size : ToggleSwitchSize = ToggleSwitchSize . Small ;
3547
3648 @Output ( )
3749 public readonly checkedChange : EventEmitter < boolean > = new EventEmitter ( ) ;
3850
51+ public isChecked : boolean = false ;
52+ public isDisabled : boolean = false ;
53+
54+ private onTouched ! : ( ) => void ;
55+ private onChanged ! : ( value : boolean ) => void ;
56+
3957 public onToggle ( toggleChange : MatSlideToggleChange ) : void {
40- this . checkedChange . emit ( toggleChange . checked ) ;
58+ this . isChecked = toggleChange . checked ;
59+ this . checkedChange . emit ( this . isChecked ) ;
60+ this . onChanged ( this . isChecked ) ;
61+ this . onTouched ( ) ;
62+ }
63+
64+ public registerOnChange ( fn : ( value : boolean ) => void ) : void {
65+ this . onChanged = fn ;
66+ }
67+
68+ public registerOnTouched ( fn : ( ) => void ) : void {
69+ this . onTouched = fn ;
70+ }
71+
72+ public setDisabledState ( isDisabled : boolean ) : void {
73+ this . isDisabled = isDisabled ;
74+ }
75+
76+ public writeValue ( isChecked : boolean | undefined ) : void {
77+ this . isChecked = isChecked ?? false ;
4178 }
4279}
0 commit comments