
No artigo anterior, mencionamos que o
serviço não só pode ser usado para processar solicitações de API, mas também tem outros usos
, como a implementação de notification das quais falaremos neste artigo. [Tutoriais relacionados recomendados: "Tutorial Angular"]
As renderizações são as seguintes:

A IU pode ser ajustada posteriormente
, então vamos detalhar passo a passo.
Para adicionar um serviço,
adicionamos o arquivo de serviço notification.service.ts em app/services (use a linha de comando para gerá-lo) e adicionamos conteúdo relacionado:
//notification.service.ts
importar {Injetável} de '@angular/core';
importar {Observável, Assunto} de 'rxjs';
// Enumeração do status da notificação export enum NotificationStatus {
Processo = "progresso",
Sucesso = "sucesso",
Falha = "falha",
Terminado = "terminado"
}
@Injetável({
fornecidoIn: 'root'
})
classe de exportação NotificationService {
notificação privada: Assunto<NotificationStatus> = new Assunto();
mensagem públicaObj: qualquer = {
primário: '',
secundário: ''
}
// Converte para um público observável getNotification(): Observable<NotificationStatus> {
retorne this.notify.asObservable();
}
// Notificação em andamento public showProcessNotification() {
this.notify.next(NotificationStatus.Process)
}
// Notificação de sucesso public showSuccessNotification() {
this.notify.next(NotificationStatus.Success)
}
//Termina notificação public showEndedNotification() {
this.notify.next(NotificationStatus.Ended)
}
// Alterar informações public changePrimarySecondary(primary?: string,secondário?:string) {
this.messageObj.primary = primário;
this.messageObj.secondary = secundário
}
construtor() { }
} É fácil de entender...
Transformamos notify em um objeto observável e depois publicamos várias informações de status.
Para criar um componente,
criamos um novo componente notification em app/components onde os componentes públicos são armazenados. Então você obterá a seguinte estrutura:
notificação ├── notificação.component.html // Esqueleto da página ├── notificação.component.scss // Estilo exclusivo da página ├── notificação.component.spec.ts // Arquivo de teste └── notificação.component.ts // Em no arquivo javascript
definimos o esqueleto da notification :
<!-- notificação.component.html -->
<!--Suporte para fechamento manual de notificações-->
<button (click)="closeNotification()">Fechar</button>
<h1>Conteúdo do lembrete: {{ mensagem }}</h1>
<!-- Personalize as principais informações de notificação-->
<p>{{primaryMessage }}</p>
<!-- Personalizar informações de notificação secundária-->
<p>{{secondaryMessage }}</p> Em seguida, simplesmente modificamos o esqueleto e adicionamos o seguinte estilo:
//notification.component.scss
:hospedar {
posição: fixa;
topo: -100%;
direita: 20px;
cor de fundo: #999;
borda: 1px sólido #333;
raio da borda: 10px;
largura: 400px;
altura: 180px;
preenchimento: 10px;
// Preste atenção ao conteúdo de active aqui Ele só aparece quando aparece uma notificação &.active {.
superior: 10px;
}
&.sucesso{}
&.progresso {}
&.falha {}
&.terminado {}
} Os quatro nomes de classe de success, progress, failure, ended correspondem à enumeração definida pelo serviço de notificação. Você pode adicionar estilos relacionados de acordo com suas próprias preferências.
Finalmente, adicionamos o código javascript comportamental.
//notificação.component.ts
importar {Component, OnInit, HostBinding, OnDestroy} de '@angular/core';
//Novo ponto de conhecimento rxjs
importar {Assinatura} de 'rxjs';
importe {debounceTime} de 'rxjs/operadores';
//Introduzir serviços relacionados import { NotificationStatus, NotificationService } from 'src/app/services/notification.service';
@Componente({
seletor: 'notificação de aplicativo',
templateUrl: './notification.component.html',
styleUrls: ['./notification.component.scss']
})
classe de exportação NotificationComponent implementa OnInit, OnDestroy {
// Tempo anti-vibração, somente leitura private somente leitura NOTIFICATION_DEBOUNCE_TIME_MS = 200;
notificação protegidaSubscrição!: Assinatura;
temporizador privado: qualquer = nulo;
mensagem pública: string = ''
// mapeamento do serviço de notificação de informações de enumeração private reflectObj: any = {
progresso: "em andamento",
sucesso: "sucesso",
falha: "falha",
terminou: "fim"
}
@HostBinding('class') notificaçãoCssClass = '';
mensagem primária pública!: string;
mensagem secundária pública!: string;
construtor(
serviço de notificação privado: NotificationService
) { }
ngOnInit(): void {
isto.init()
}
inicialização pública() {
//Adicionar informações de assinatura relevantes this.notificationSubscription = this.notificationService.getNotification()
.cano(
debounceTime(this.NOTIFICATION_DEBOUNCE_TIME_MS)
)
.subscribe((notificationStatus: NotificationStatus) => {
if(statusdenotificação) {
this.resetTimeout();
//Adicionar estilos relacionados this.notificationCssClass = `active ${ warningStatus }`
this.message = this.reflectObj[notificationStatus]
// Obtenha a mensagem primária personalizada this.primaryMessage = this.notificationService.messageObj.primary;
// Obtenha informações secundárias personalizadas this.secondaryMessage = this.notificationService.messageObj.secondary;
if(notificationStatus === NotificationStatus.Process) {
this.resetTimeout()
este.timer = setTimeout(() => {
this.resetView()
}, 1000)
} outro {
this.resetTimeout();
este.timer = setTimeout(() => {
this.notificationCssClass = ''
this.resetView()
}, 2000)
}
}
})
}
private resetView(): void {
esta.mensagem = ''
}
// Fecha o cronômetro private resetTimeout(): void {
if(este.temporizador) {
clearTimeout(this.timer)
}
}
// Fechar notificação public closeNotification() {
this.notificationCssClass = ''
this.resetTimeout()
}
// Componente é destruído ngOnDestroy(): void {
this.resetTimeout();
//Cancelar todas as mensagens de assinatura this.notificationSubscription.unsubscribe()
}
} Aqui, apresentamos o ponto de conhecimento de rxjs . RxJS é uma biblioteca de programação reativa que usa Observables , o que torna mais fácil escrever código assíncrono ou baseado em retorno de chamada. Esta é uma ótima biblioteca e você aprenderá mais sobre ela nos próximos artigos.
Aqui usamos a função anti-shake debounce . Função anti-shake significa que depois que um evento é acionado, ele só pode ser executado uma vez após n segundos. Se o evento for acionado novamente em n segundos, o tempo de execução da função será. recalculado. Simplificando: quando uma ação é acionada continuamente, apenas a última vez é executada.
ps: função de
throttle: restringe uma função a ser executada apenas uma vez dentro de um determinado período de tempo .
Durante a entrevista, o entrevistador gosta de perguntar...
Chamando
Como este é um serviço global, chamamos este componente em app.component.html :
// app.component.html <router-outlet></router-outlet> <app-notification></app-notification>
Para facilitar a demonstração, adicionamos um botão em user-list.component.html para acionar facilmente a demonstração:
// user-list.component.html <button (click)="showNotification()">click show warning</button>
aciona o código relevante:
// user-list.component.ts
importar {NotificationService} de 'src/app/services/notification.service';
// ...
construtor(
serviço de notificação privado: NotificationService
) { }
//Mostra notificação showNotification(): void {
this.notificationService.changePrimarySecondary('Informação primária 1');
this.notificationService.showProcessNotification();
setTimeout(() => {
this.notificationService.changePrimarySecondary('Informação primária 2', 'Informação secundária 2');
this.notificationService.showSuccessNotification();
}, 1000)
} Neste ponto, terminamos, simulamos com sucesso a função notification . Podemos modificar componentes de serviços relacionados de acordo com as necessidades reais e personalizá-los para atender às necessidades do negócio. Se estivermos desenvolvendo um sistema para uso interno, é recomendável usar bibliotecas de UI maduras. Elas nos ajudaram a encapsular vários componentes e serviços, economizando muito tempo de desenvolvimento.