Angular 4 - Exemplos

Neste capítulo, discutiremos alguns exemplos relacionados ao Angular 4.

Para começar, criamos um exemplo que mostra um formulário de login com entrada como username e password. Ao inserir os valores corretos, ele entrará e mostrará outro formulário onde você pode inserir os dados do cliente. Além disso, criamos quatro componentes - cabeçalho, rodapé, login do usuário e página principal.

Os componentes são criados usando o seguinte comando -

cabeçalho do componente ng g

C:\ngexamples\aexamples>ng g component header
installing component
   create src\app\header\header.component.css
   create src\app\header\header.component.html
   create src\app\header\header.component.spec.ts
   create src\app\header\header.component.ts
   update src\app\app.module.ts

rodapé do componente ng g

C:\ngexamples\aexamples>ng g component footer
installing component
   create src\app\footer\footer.component.css
   create src\app\footer\footer.component.html
   create src\app\footer\footer.component.spec.ts
   create src\app\footer\footer.component.ts
   update src\app\app.module.ts

ng g componente userlogin

C:\ngexamples\aexamples>ng g component userlogin
installing component
   create src\app\userlogin\userlogin.component.css
   create src\app\userlogin\userlogin.component.html
   create src\app\userlogin\userlogin.component.spec.ts
   create src\app\userlogin\userlogin.component.ts
   update src\app\app.module.ts

ng g componente mainpage

C:\ngexamples\aexamples>ng g component mainpage
installing component
   create src\app\mainpage\mainpage.component.css
   create src\app\mainpage\mainpage.component.html
   create src\app\mainpage\mainpage.component.spec.ts
   create src\app\mainpage\mainpage.component.ts
   update src\app\app.module.ts

No app.module.ts, o módulo pai terá todos os componentes adicionados quando criado. O arquivo tem a seguinte aparência -

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';

import { RouterModule, Routes} froms '@angular/router';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import {MdTableModule} from '@angular/material';

import {HttpModule} from "@angular/http";
import {MdInputModule} from '@angular/material';
import { AppComponent } from './app.component';

import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
import { UserloginComponent } from './userlogin/userlogin.component';
import { MainpageComponent } from './mainpage/mainpage.component';

const appRoutes: Routes = [
   {
      path: '',
      component: UserloginComponent
   },
   {
      path: 'app-mainpage',
      component: MainpageComponent
   }
];

@NgModule({
   declarations: [
      AppComponent,
      HeaderComponent,
      FooterComponent,
      UserloginComponent,
      MainpageComponent
   ],
   
   imports: [
      BrowserModule,
      ReactiveFormsModule,
      RouterModule.forRoot(appRoutes),
      BrowserAnimationsModule,
      HttpModule,
      MdTableModule,
      MdInputModule
   ],
   
   providers: [],
   bootstrap: [AppComponent]
})
export class AppModule { }

Os componentes criados acima são adicionados -

import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
import { UserloginComponent } from './userlogin/userlogin.component';
import { MainpageComponent } from './mainpage/mainpage.component';

Os componentes também são adicionados às declarações -

declarations: [
   AppComponent,
   HeaderComponent,
   FooterComponent,
   UserloginComponent,
   MainpageComponent
],

No pai app.component.html, adicionamos a estrutura principal do arquivo que será vista pelo usuário.

<div class="mainpage">
   <app-header></app-header>
   <router-outlet></router-outlet>
   <app-footer></app-footer>
</div>

Criamos um div e adicionamos <app-header></app-header>, <router-outlet></router-outlet> e <app-footer></app-footer>.

o <router-outlet></router-outlet>é usado para navegar entre uma página para outra. Aqui, as páginas são do formulário de login e assim que obtiver sucesso redirecionará para a página principal, ou seja, o formulário do cliente.

Para obter o formulário de login primeiro e depois obter o mainpage.component.html, as alterações são feitas em app.module.ts como mostrado abaixo -

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';

import { RouterModule, Routes} from '@angular/router';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import {MdTableModule} from '@angular/material';

import {HttpModule} from "@angular/http";
import {MdInputModule} from '@angular/material';
import { AppComponent } from './app.component';

import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
import { UserloginComponent } from './userlogin/userlogin.component';
import { MainpageComponent } from './mainpage/mainpage.component';

const appRoutes: Routes = [
   {
      path: '',
      component: UserloginComponent
   },
   {
      path: 'app-mainpage',
      component: MainpageComponent
   }
];

@NgModule({
   declarations: [
      AppComponent,
      HeaderComponent,
      FooterComponent,
      UserloginComponent,
      MainpageComponent
   ],
   
   imports: [
      BrowserModule,
      ReactiveFormsModule,
      RouterModule.forRoot(appRoutes),
      BrowserAnimationsModule,
      HttpModule,
      MdTableModule,
      MdInputModule
   ],
   providers: [],
   bootstrap: [AppComponent]
})
export class AppModule { }

Nós importamos RouterModule e Routes de @anuglar/router. Nas importações, o RouterModules leva appRoutes como o parâmetro que é definido acima como -

const appRoutes: Routes = [
   {
      path: '',
      component: UserloginComponent
   },
   {
      path: 'app-mainpage',
      component: MainpageComponent
   }
];

As rotas usam a matriz de componentes e, por padrão, o userloginComponent é chamado.

Dentro userlogin.component.ts, importamos o roteador e navegamos para mainpage.component.html com base na condição mostrada abaixo -

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators} from '@angular/forms';
import { Router} from '@angular/router';

@Component({
   selector: 'app-userlogin',
   templateUrl: './userlogin.component.html',
   styleUrls: ['./userlogin.component.css']
})

export class UserloginComponent implements OnInit {
   formdata;
   constructor(private router: Router) { }
   ngOnInit() {
      this.formdata = new FormGroup({
         uname: new FormControl("", Validators.compose([
            Validators.required,
            Validators.minLength(6)
         ])),
         passwd: new FormControl("", this.passwordvalidation)
      });
   }
   
   passwordvalidation(formcontrol) {
      if (formcontrol.value.length < 5) {
         return {"passwd" : true};
      }
   }
   
   onClickSubmit(data) {
      console.log(data.uname);
      if (data.uname=="systemadmin" && data.passwd=="admin123") {
         alert("Login Successful");
         this.router.navigate(['app-mainpage'])
      } else {
         alert("Invalid Login");
         return false;
      }
   }
}

A seguir está o arquivo .ts para app.component.ts. Apenas os detalhes padrão estão presentes nele.

import { Component } from '@angular/core';

@Component({
   selector: 'app-root',
   templateUrl: './app.component.html',
   styleUrls: ['./app.component.css']
})
export class AppComponent {title = 'app';}

Vamos agora exibir os detalhes de cada um dos arquivos de componentes. Para começar, vamos primeiro pegar o componente do cabeçalho. Para o novo componente, quatro arquivos são criadosheader.component.ts, header.component.html, header.component.css, and header.component.spec.ts.

header.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
   selector: 'app-header',
   templateUrl: './header.component.html',
   styleUrls: ['./header.component.css']
})

export class HeaderComponent implements OnInit {
   constructor() { }
   ngOnInit() {}
}

header.component.html

<div>
   <hr />
</div>

Não adicionamos nenhum css. Isso esvazia o arquivo header.component.css. Também oheader.compoent.spec.ts o arquivo está vazio porque os casos de teste não são considerados aqui.

Para o cabeçalho, desenharemos uma linha horizontal. Um logotipo ou qualquer outro detalhe pode ser adicionado para tornar o cabeçalho mais criativo.

Vamos agora considerar a criação de um componente de rodapé.

Para o componente de rodapé, footer.component.ts, footer.component.html, footer.component.spec.ts and footer.component.css arquivos são criados.

footer.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
   selector: 'app-footer',
   templateUrl: './footer.component.html',
   styleUrls: ['./footer.component.css']
})

export class FooterComponent implements OnInit {
   constructor() { }
   ngOnInit() { }
}

footer.component.html

<hr/>

Como não adicionamos nenhum css, o footer.component.csso arquivo está vazio. Também ofooter.compoent.spec.ts o arquivo está vazio porque os casos de teste não são considerados aqui.

Para o rodapé, desenharemos apenas uma linha horizontal conforme mostrado no arquivo .html.

Vamos agora ver como funciona o componente userlogin. Os seguintes arquivos para o componente userlogin criado sãouserlogin.component.css, userlogin.component.html, userlogin.component.ts, e userlogin.component.spec.ts.

Os detalhes dos arquivos são os seguintes -

userlogin.component.html

<div class="form_container">
   <form [formGroup]="formdata" (ngSubmit) = "onClickSubmit(formdata.value)" >
      <header>Login</header>
      <label>Username <span>*</span></label>
      <input type="text" name="uname" formControlName="uname"/>
      
      <div class="help">At least 6 character</div>
      <label>Password <span>*</span></label>
      <input type="password" class="fortextbox" name="passwd" formControlName="passwd"/>
      
      <div class="help">Use upper and lowercase lettes as well</div>
      <button [disabled]="!formdata.valid" value="Login">Login</button>
   </form>
</div>

Aqui, criamos um formulário com dois controles de entrada Username e Password. Esta é uma abordagem de formulário dirigida por modelo e os detalhes da mesma são explicados no Capítulo 14 - Formulários.

Consideramos o nome de usuário e a senha obrigatórios, portanto, a validação dos mesmos é adicionada no ts. Ao clicar no botão enviar, o controle é passado para oonClickSubmit, que é definido no arquivo ts.

userlogin.component.ts

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators} from '@angular/forms';
import { Router} from '@angular/router';

@Component({
   selector: 'app-userlogin',
   templateUrl: './userlogin.component.html',
   styleUrls: ['./userlogin.component.css']
})

export class UserloginComponent implements OnInit {
   formdata;
   constructor(private router: Router) { }
   ngOnInit() {
      this.formdata = new FormGroup({
         uname: new FormControl("", Validators.compose([
            Validators.required,
            Validators.minLength(6)
         ])),
         passwd: new FormControl("", this.passwordvalidation)
      });
   }
   passwordvalidation(formcontrol) {
      if (formcontrol.value.length < 5) {
         return {"passwd" : true};
      }
   }
   onClickSubmit(data) {
      console.log(data.uname);
      if (data.uname == "systemadmin" && data.passwd == "admin123") {
         alert("Login Successful");
         this.router.navigate(['app-mainpage'])
      }
   }
}

Para o controle de formulário e validação, os módulos são importados conforme mostrado abaixo

import { FormGroup, FormControl, Validators} from '@angular/forms';

Precisamos de um roteador para navegar para um componente diferente quando o usuário e a senha estiverem corretos. Para isso, o roteador é importado conforme mostrado abaixo -

import { Router} from '@angular/router';

Dentro ngOnInit, a validação do formulário é feita. Precisamos que o nome de usuário tenha mais de seis caracteres e o campo é obrigatório. A mesma condição se aplica à senha também.

Ao clicar em enviar, podemos verificar se o nome de usuário é systemadmin e a senha é admin123. Se sim, aparecerá uma caixa de diálogo que mostraLogin Successful e o roteador navega para app-mainpage, que é o seletor do componente mainpage.

Há css adicionado ao formulário em userlogin.component.css arquivo -

.form_container{
   margin : 0 auto;
   width:600px;
}

form {
   background: white;
   width: 500px;
   box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.7);
   font-family: lato;
   position: relative;
   color: #333;
   border-radius: 10px;
}

form header {
   background: #FF3838;
   padding: 30px 20px;
   color: white;
   font-size: 1.2em;
   font-weight: 600;
   border-radius: 10px 10px 0 0;
}

form label {
   margin-left: 20px;
   display: inline-block;
   margin-top: 30px;
   margin-bottom: 5px;
   position: relative;
}

form label span {
   color: #FF3838;
   font-size: 2em;
   position: absolute;
   left: 2.3em;
   top: -10px;
}
form input {
   display: block;
   width: 50%;
   margin-left: 20px;
   padding: 5px 20px;
   font-size: 1em;
   border-radius: 3px;
   outline: none;
   border: 1px solid #ccc;
}

form .help {
   margin-left: 20px;
   font-size: 0.8em;
   color: #777;
}

form button {
   position: relative;
   margin-top: 30px;
   margin-bottom: 30px;
   left: 50%;
   transform: translate(-50%, 0);
   font-family: inherit;
   color: white;
   background: #FF3838;
   outline: none;
   border: none;
   padding: 5px 15px;
   font-size: 1.3em;
   font-weight: 400;
   border-radius: 3px;
   box-shadow: 0px 0px 10px rgba(51, 51, 51, 0.4);
   cursor: pointer;
   transition: all 0.15s ease-in-out;
}
form button:hover {
   background: #ff5252;
}

o userlogin.component.spec.ts o arquivo está vazio porque não há casos de teste no momento.

Vamos agora discutir como o componente mainpage funciona. Os arquivos criados para o componente da página principal sãomainpage.component.ts, mainpage.component.html, mainpage.component.css, e mainpage.component.spect.ts.

mainpage.component.ts

import { Component, OnInit, ViewChild} from '@angular/core';
import { FormGroup, FormControl, Validators} from '@angular/forms';

import {Http, Response, Headers, RequestOptions } from "@angular/http";
import 'rxjs/add/operator/map';

@Component({
   selector: 'app-mainpage',
   templateUrl: './mainpage.component.html',
   styleUrls: ['./mainpage.component.css']
})

export class MainpageComponent implements OnInit {
   formdata;
   cutomerdata;
   constructor(private http: Http) { }
   stateCtrl: FormControl;
   ngOnInit() {
      this.formdata = new FormGroup({
         fname: new FormControl("", Validators.compose([
            Validators.required,
            Validators.minLength(3)
         ])),
         lname: new FormControl("", Validators.compose([
            Validators.required,
            Validators.minLength(3)
         ])),
         address:new FormControl(""),
         phoneno:new FormControl("")
      });
   }
   onClickSubmit(data) {
      document.getElementById("custtable").style.display="";
      this.cutomerdata = [];
      for (var prop in data) {
         this.cutomerdata.push(data[prop]);
      }
      console.log(this.cutomerdata);
   }
}

Criamos um formulário de cliente com nome, sobrenome, endereço e número de telefone. A validação do mesmo é feita com ongOnInitfunção. Ao clicar em enviar, o controle chega à funçãoonClickSubmit. Aqui, a tabela que é usada para exibir os detalhes inseridos fica visível.

O customerdata é convertido de json para array para que possamos usar o mesmo em ngFor na tabela, o que é feito no arquivo .html conforme mostrado abaixo.

mainpage.component.html

<div class="form_container">
   <form [formGroup]="formdata" (ngSubmit) = "onClickSubmit(formdata.value)" >
      <header>Customer Details</header>
      <label>FirstName <span>*</span></label>
      <input type="text" name="fname" formControlName="fname"/>
      <label>LastName <span>*</span></label>
      
      <input type="text" name="lname" formControlName="lname"/>
      <label>Address <span></span></label>
      <input type="text" name="address" formControlName="address"/>
      <label>Phone No <span></span></label>
      <input type="text" name="phoneno" formControlName="phoneno"/>
      <button [disabled]="!formdata.valid" value="Submit">Submit</button>
   </form>
</div>
<br/>

<div id="custtable" style="display:none;margin:0 auto;">
   <table>
      <tr>
         <td>FirstName</td>
         <td>LastName</td>
         <td>Address</td>
         <td>Phone No</td>
      </tr>
      <tr>
         <td *ngFor="let data of cutomerdata">
            <h5>{{data}}</h5>
         </td>
      </tr>
   </table>
</div>

Aqui, o primeiro div tem os detalhes do cliente e o segundo div tem a tabela, que mostra os detalhes inseridos. A exibição do login do usuário e os detalhes do cliente são mostrados abaixo. Esta é a página com formulário de login, cabeçalho e rodapé.

Depois de inserir os detalhes, a tela é mostrada abaixo

Ao clicar em enviar, é exibida uma caixa de diálogo que mostra Login bem-sucedido.

Se os detalhes forem inválidos, aparecerá uma caixa de diálogo que mostra Login inválido conforme mostrado abaixo -

Se o login for bem-sucedido, ele prosseguirá para a próxima forma de Detalhes do cliente, conforme mostrado abaixo -

Depois que os detalhes são inseridos e enviados, uma caixa de diálogo aparece, mostrando que os detalhes do cliente são adicionados conforme mostrado na captura de tela abaixo -

Quando clicarmos em OK na imagem acima, os detalhes aparecerão conforme mostrado na imagem abaixo -