Dev (Back & Front)ARTIGO

Angular 6: CanDeactivate

Continuando sua série sobre Route Guards, o autor apresenta no artigo a seguir, um passo a passo ensinando a usar o CanDeactivate.

Angular CanDeactivate

Dando continuidade aos meus artigos sobre Route Guards, hoje mostrarei como utilizar o CanDeactivate. Caso tenha interesse em ler os primeiros artigo, segue o link de cada um deles abaixo:

O CanDeactivatedeve ser utilizado em cenários onde precisamos verificar se o usuário pode desativar um rota (ir para uma outra rota) ou não. Imagine o seguinte exemplo: seu usuário está preenchendo um formulário e antes de salvar ele tenta ir para uma outra rota. Com o canDeactivate você pode Interceptar e enviar uma mensagem para ele, solicitando que confirme se realmente deseja realizar essa operação.

Para os próximos passos eu irei utilizar o projeto iniciado no meu artigo anterior. Caso tenha interesse em clonar ele, segue o link no GitHub:

Abra esse projeto no seu editor de textos, em seguida execute o comando abaixo no seu terminal:

bash
ng g s guards/productsdeactivate
ng g c products/product-edit

O passo anterior deve criar um serviço chamado ProductsdeactivateService e um componente chamado ProductEditComponent. Adicione esse novo componente nas suas rotas, e em seguida abra o arquivo productsdeactivate.service.ts e atualize ele com o trecho de código abaixo:

import { Injectable } from '@angular/core';
import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ProductEditComponent } from '../products/product-edit/product-edit.component';

@Injectable({
  providedIn: 'root'
})
export class ProductsdeactivateService implements CanDeactivate<ProductEditComponent> {

  canDeactivate(
    component: ProductEditComponent,
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): boolean {
    console.log(route)
    return window.confirm("Tem certeza que deseja sair dessa página?");
  }
}

Não esqueça de adicionar esse serviço nos providers do seu ProductsModule.

bash
providers: [ProductsdeactivateService]

Agora adicione o CandDeactivate na sua rota edit:

css
{ path: 'product-edit/:id', component: ProductEditComponent, canDeactivate: [ProductsdeactivateService] },

Em seguida atualize o arquivo app.component.html com o seguinte trecho de código:

<button routerLink="/login">Login</button>
<button routerLink="/home">Home</button>
<button routerLink="/products">products</button>
<button routerLink="/products/product-edit/13">products-edit</button>

<router-outlet></router-outlet>

Testando

Para testar execute o comando ng serve, em seguida abra no seu navegador o endereço: http://localhost:4200/. Abaixo você tem uma imagem demonstrando esse passo:

(canDeactivate)

Bem simples, né? Dessa forma você consegue notificar o seu usuário antes que ele saia de uma determinada rota sem finalizar alguma ação necessária.

Bom, espero que tenham gostado e até um próximo artigo, pessoal!

Microsoft (MVP), atualmente trabalha como Arquiteto de Software para TV Bandeirantes. Nesses últimos anos, focou nas tecnologias criadas pela Microsoft, mas sempre esteve antenado para as novas tecnologias que estão surgindo no mercado. Em um breve resumo, é uma pessoa apaixonada pelo que faz, tem a sua profissão como hobby.

Ver perfil