- Structural Directives
- Forms
- Form Validation (with and without Material)
< div *ngIf="hero" class="name">{{user.name}}< /div>
< div *ngIf="user.lastName; else noLastName">
You're in the last name club Mr./Mrs.{{ user.lastName }}!
< / div>
< ng-template #noLastName>
Sorry, you don't have a name...
< / ng-template>
< div [ngSwitch]="product.price" >
< p *ngSwitchCase="12.99">Expensive!!< /p>
< p *ngSwitchCase="9.99">Pricey.< /p>
< p *ngSwitchCase="2.99">Darn Cheap!< /p>
< p *ngSwitchDefault>Either really expensive or TOO CHEAP!< /p>
< /div>
< p [ngClass]="user.lastName ? 'blue-text' : 'red-text' ">{{user.firstName}}< /p>
[dataSource]="users"
< li *ngFor="let user of users">{{user.firstName}}< /li>
Try it out!
//In app.module.ts
import { FormsModule } from '@angular/forms';
//...
@NgModule({
imports: [
BrowserModule,
FormsModule
],
/...
< form #loginForm="ngForm">
//...
< /form>
...
< input type="email" name="email" [(ngModel)]="user.email" #email="ngModel"/>
Name attribute is required for Angular Template driven forms to work.
You can use these classes to change styles based on the validity of your forms
// your email input here...
< div [hidden]="email.valid || email.pristine"
class="alert alert-danger">
Email is required
< /div>
(click)="submitLogin(); loginForm.reset()"
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [
// other imports ...
ReactiveFormsModule
//login.component.ts
import { FormBuilder } from '@angular/forms';
...
export class LoginComponent {
loginForm = this.fb.group({
email: [],
password: []
});
constructor(private fb: FormBuilder) { }
}
//login.component.ts
import { Validators } from '@angular/forms';
//...
email: ['', Validators.required],
password: ['', Validators.required]
});
//login.component.html
< input name="email" formControlName="email" required />
For testing: let's add the form's status property to our view:
//login.component.html
{{loginForm.status}}