Suppose I have this simple form with some fields (Stackblitz example):
@Component({
selector: 'my-app',
template:
`
<h1>AppComponent</h1>
<form>
<h2>UserData</h2>
<userdata [user]="model.userData"></userdata>
<h2>Actions</h2>
<actionbar ></actionbar>
</form>
`,
})
export class AppComponent { ... }
@Component({
selector: 'userdata',
template:
`
<span class="status {{name.status}}">{{name.status}}</span>
full name:
<input name="name" #name="ngModel" pattern="^.* .*$" required [(ngModel)]="user.name">
<br>
<h3>--- Contacts ---</h3>
<span class="status {{email.status}}">{{email.status}}</span>
email:
<input name="email" #email="ngModel" type="email" [email]="true" [(ngModel)]="user.contacts.email">
<br>
<span class="status {{phone.status}}">{{phone.status}}</span>
phone:
<input name="phone" #phone="ngModel" pattern="^[0-9]*$" [(ngModel)]="user.contacts.phone">
<br>
<h4>---- Address ----</h4>
<span class="status {{street.status}}">{{street.status}}</span>
street:
<input name="street" #street="ngModel" [(ngModel)]="user.contacts.address.street">
<br>
<span class="status {{city.status}}">{{city.status}}</span>
city:
<input name="city" #city="ngModel" [(ngModel)]="user.contacts.address.city">
<br>
<span class="status {{zipcode.status}}">{{zipcode.status}}</span>
zipcode:
<input name="zipcode" #zipcode="ngModel" pattern="^[0-9]{5}$" [(ngModel)]="user.contacts.address.zipcode">
<br>
`,
viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],
})
export class UserDataComponent {
@Input() user: any;
}
@Component({
selector: 'actionbar',
template:
`
<span class="status {{form.status}}">{{form.status}}</span>
<input type="button" value="Submit" [disabled]="form.invalid">
`,
viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],
})
export class ActionBarComponent { ... }
(basically a form with fields for full name and contact information such as email, phone, address)
Note that one can only submit the form if it is valid. The form is valid only if everything nested inside it is valid.
For validations over a single field, it is rather easy to do (those fields already have some, like regex patterns and requiredness).
Now I want to add two other business requirements:
at least one contact information (email, phone or address) is required;
if any field in address is set, then all of them (street, city, zipcode) are required.
Is it possible to even do it in template-driven forms?