Skip to content

Commit d4e6ac0

Browse files
committed
Angular Forms Course
1 parent c65b3f8 commit d4e6ac0

File tree

6 files changed

+121
-8
lines changed

6 files changed

+121
-8
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<fieldset [formGroup]="form">
2+
3+
<legend>{{legend}}</legend>
4+
5+
<mat-form-field>
6+
7+
<input matInput
8+
placeholder="Address Line 1"
9+
formControlName="addressLine1" (blur)="onTouched()">
10+
11+
</mat-form-field>
12+
13+
<mat-form-field>
14+
15+
<input matInput
16+
placeholder="Address Line 2"
17+
formControlName="addressLine2" (blur)="onTouched()">
18+
19+
</mat-form-field>
20+
21+
<mat-form-field>
22+
23+
<input matInput
24+
placeholder="Zip Code"
25+
formControlName="zipCode" (blur)="onTouched()">
26+
27+
</mat-form-field>
28+
29+
<mat-form-field>
30+
31+
<input matInput
32+
placeholder="City"
33+
formControlName="city" (blur)="onTouched()">
34+
35+
</mat-form-field>
36+
37+
</fieldset>

src/app/address-form/address-form.component.scss

Whitespace-only changes.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import {Component, forwardRef, Input, OnDestroy, OnInit} from '@angular/core';
2+
import {ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators} from '@angular/forms';
3+
import {noop, Subscription} from 'rxjs';
4+
5+
@Component({
6+
selector: 'address-form',
7+
templateUrl: './address-form.component.html',
8+
styleUrls: ['./address-form.component.scss'],
9+
providers: [
10+
{
11+
provide: NG_VALUE_ACCESSOR,
12+
multi: true,
13+
useExisting: forwardRef(() => AddressFormComponent)
14+
}
15+
]
16+
})
17+
export class AddressFormComponent implements ControlValueAccessor, OnDestroy {
18+
19+
@Input()
20+
legend:string;
21+
22+
form: FormGroup;
23+
24+
onTouched: Function = noop;
25+
26+
onChangeSubs: Subscription[] = [];
27+
28+
constructor(private fb: FormBuilder) {
29+
this.form = this.fb.group({
30+
addressLine1: ["", Validators.required],
31+
addressLine2: ["", Validators.required],
32+
zipCode: ["", Validators.required],
33+
city: ["", Validators.required]
34+
});
35+
}
36+
37+
ngOnDestroy() {
38+
for (let sub of this.onChangeSubs) {
39+
sub.unsubscribe();
40+
}
41+
}
42+
43+
registerOnChange(onChange: any) {
44+
const sub = this.form.valueChanges.subscribe(onChange);
45+
this.onChangeSubs.push(sub);
46+
}
47+
48+
registerOnTouched(onTouched: Function) {
49+
this.onTouched = onTouched;
50+
}
51+
52+
setDisabledState(disabled: boolean) {
53+
if (disabled) {
54+
this.form.disable();
55+
}
56+
else {
57+
this.form.enable();
58+
}
59+
}
60+
61+
writeValue(value: any) {
62+
if (value) {
63+
this.form.setValue(value, {emitEvent: false});
64+
}
65+
}
66+
67+
}

src/app/app.module.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {BrowserModule} from '@angular/platform-browser';
2-
import {NgModule} from '@angular/core';
2+
import {forwardRef, NgModule} from '@angular/core';
33

44
import {AppRoutingModule} from './app-routing.module';
55
import {AppComponent} from './app.component';
@@ -28,7 +28,7 @@ import {CoursesService} from "./services/courses.service";
2828
import {HttpClientModule} from "@angular/common/http";
2929
import {CourseResolver} from "./services/course.resolver";
3030
import { CourseDialogComponent } from './course-dialog/course-dialog.component';
31-
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
31+
import {FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';
3232
import {MatMomentDateModule} from "@angular/material-moment-adapter";
3333
import {LoginComponent} from './login/login.component';
3434
import { CreateCourseComponent } from './create-course/create-course.component';
@@ -40,6 +40,7 @@ import {MatCheckboxModule} from '@angular/material/checkbox';
4040
import {CreateCourseStepOneComponent} from './create-course/create-course-step-one/create-course-step-one.component';
4141
import {CreateCourseStepTwoComponent} from './create-course/create-course-step-two/create-course-step-two.component';
4242
import {MatStepperModule} from '@angular/material/stepper';
43+
import { AddressFormComponent } from './address-form/address-form.component';
4344

4445
@NgModule({
4546
declarations: [
@@ -54,7 +55,8 @@ import {MatStepperModule} from '@angular/material/stepper';
5455
PasswordStrengthDirective,
5556
OnlyOneErrorPipe,
5657
CreateCourseStepOneComponent,
57-
CreateCourseStepTwoComponent
58+
CreateCourseStepTwoComponent,
59+
AddressFormComponent
5860
],
5961
imports: [
6062
BrowserModule,

src/app/create-course/create-course-step-one/create-course-step-one.component.html

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
2+
<div class="form-val">
3+
4+
{{form.value | json}}
5+
6+
</div>
7+
18
<div [formGroup]="form">
29

310
<mat-form-field>
@@ -77,10 +84,8 @@
7784

7885
</mat-form-field>
7986

80-
<div class="form-val">
81-
82-
{{form.controls['title'].errors | json}}
87+
<address-form formControlName="addressOne" legend="Address 1"></address-form>
8388

84-
</div>
89+
<address-form formControlName="addressTwo" legend="Address 2"></address-form>
8590

8691
</div>

src/app/create-course/create-course-step-one/create-course-step-one.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ export class CreateCourseStepOneComponent implements OnInit {
3232
category: ["BEGINNER", Validators.required],
3333
downloadsAllowed: [false, Validators.requiredTrue],
3434
releasedAt: [new Date(), Validators.required],
35-
longDescription: ["",[Validators.required, Validators.minLength(3)]]
35+
longDescription: ["",[Validators.required, Validators.minLength(3)]],
36+
addressOne: [null],
37+
addressTwo: [null]
3638
});
3739
}
3840

0 commit comments

Comments
 (0)