1 view

Validating Template based Forms

login.component.html

<h1>Login</h1>
<hr>
<div class="col-md-4">
  <form #loginForm="ngForm" (ngSubmit)="login(loginForm.value)" 
    novalidate autocomplete="off">
    <div class="form-group" >
      <label for="userName">User Name:</label>
      <em *ngIf="loginForm.controls.userName?.invalid && (loginForm.controls.userName?.touched || mouseoverLogin)">Required</em>
      <input 
        (ngModel)="userName" 
        name="userName" 
        required 
        id="userName" 
        type="text" 
        class="form-control" 
        placeholder="User Name..." />
        
    </div>
    <div class="form-group" >
      <label for="password">Password:</label>
      <em *ngIf="loginForm.controls.password?.invalid && (loginForm.controls.password?.touched || mouseoverLogin)">Required</em>
      <input 
        (ngModel)="password" 
        name="password" 
        required 
        id="password" 
        type="password" 
        class="form-control"
        placeholder="Password..." />
        
    </div>
     <span (mouseenter)="mouseoverLogin=true" (mouseleave)="mouseoverLogin=false">  
        <button [disabled]="loginForm.invalid" type="submit" class="btn btn-primary mr-5">Login</button>
    </span> 
    <button (click)="cancel()" type="button" class="btn btn-default">Cancel</button>
  </form>
</div>
<!-- <div class="col-md-8">
    <div class="col-md-6">
        loginForm.valid: <strong>{{loginForm.valid}}</strong><br>
        loginForm.invalid: <strong>{{loginForm.invalid}}</strong><br>
        loginForm.dirty: <strong>{{loginForm.dirty}}</strong><br>
        loginForm.pristine: <strong>{{loginForm.pristine}}</strong><br>
        loginForm.touched: <strong>{{loginForm.touched}}</strong><br>
        loginForm.untouched: <strong>{{loginForm.untouched}}</strong><br>
    </div>
    <div class="col-md-6">
        loginForm.controls.userName.valid: <strong>{{loginForm.valid}}</strong><br>
        loginForm.controls.userName.invalid: <strong>{{loginForm.invalid}}</strong><br>
        loginForm.controls.userName.dirty: <strong>{{loginForm.dirty}}</strong><br>
        loginForm.controls.userName.pristine: <strong>{{loginForm.pristine}}</strong><br>
        loginForm.controls.userName.touched: <strong>{{loginForm.touched}}</strong><br>
        loginForm.controls.userName.untouched: <strong>{{loginForm.untouched}}</strong><br>
    </div>
    <div class="col-md-6">
        loginForm.controls.password.valid: <strong>{{loginForm.valid}}</strong><br>
        loginForm.controls.password.invalid: <strong>{{loginForm.invalid}}</strong><br>
        loginForm.controls.password.dirty: <strong>{{loginForm.dirty}}</strong><br>
        loginForm.controls.password.pristine: <strong>{{loginForm.pristine}}</strong><br>
        loginForm.controls.password.touched: <strong>{{loginForm.touched}}</strong><br>
        loginForm.controls.password.untouched: <strong>{{loginForm.untouched}}</strong><br>
    </div>
</div> -->

<!-- {{loginForm.value | json}} -->

login.component.ts

import { Component } from '@angular/core'
import { AuthService } from './auth.service';
import { Router } from '@angular/router';

@Component({
    templateUrl: './login.component.html',
    styles: [`
        em{ float: right; color: #e05c65; padding-left: 10px;}
    `]
})

export class LoginComponent{
    userName
    password
    mouseoverLogin

    constructor(private authService: AuthService, private router: Router){}

    login(formValues){
        this.authService.loginUser(formValues.userName, formValues.password)
        this.router.navigate(['events']);
        //console.log(formValues)
    }
    cancel(){
        this.router.navigate(['events']);
    }
}

auth.service.ts

import { IUser } from './user.model';
import { Injectable } from '@angular/core';

@Injectable()
export class AuthService{

    currentUser: IUser;
    loginUser(userName: string, password: string){
        this.currentUser = {
            id: 1,
            userName: userName,
            firstName: 'Bipon',
            lastName: 'Biswas'
        }
    }
    isAuthenticated(){
        return !this.currentUser;
    }
}

app.module.ts [register auth.service.ts file]

import { AuthService } from './user/auth.service';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { EventsAppComponent } from './events-app.component';
import { EventListComponent } from './events/event-list.component';
import { EventThumbnailComponent } from './events/event-thumbnail.component';
import { NavBarComponent } from './nav/navbar-component';
import { EventService } from './events/shared/event.service';
import { ToastrService } from './common/toastr.service';
import { EventDetailsComponent } from './events/event-details/event-details.component';
import { RouterModule } from '@angular/router';
import { appRoutes } from 'src/routes';
import { CreateEventComponent } from './events/event-details/create-event.component';
import { Error404Component } from './errors/404.component';
import { EventRouteActivator } from './events/event-details/event-route.activator.service';
import { EventListResolver } from './events/shared/events-list-resolver.service';
import { UserModule } from './user/user.module';

@NgModule({
  declarations: [
    EventsAppComponent,
    EventListComponent,
    EventThumbnailComponent,
    NavBarComponent,
    EventDetailsComponent,
    CreateEventComponent,
    Error404Component
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(appRoutes)
  ],
  providers: [
    EventService, 
    ToastrService, 
    EventRouteActivator,
    EventListResolver,
    AuthService,
      {
        provide:'canDeactivateCreateEvent',
        useValue: checkDirtyState
      }
  ],
  bootstrap: [EventsAppComponent]
})
export class AppModule { }

export function checkDirtyState(component: CreateEventComponent){
  if(component.isDirty)
    return window.confirm('You have not saved this event, do you really want to cancel?')
  return true
}

Leave a Reply