Dans l'article précédent, nous avons mentionné que le
service peut non seulement être utilisé pour traiter les requêtes API, mais a également d'autres utilisations
, comme la mise en œuvre de notification
dont nous parlerons dans cet article. [Tutoriels associés recommandés : "Tutoriel Angular"]
Les rendus sont les suivants :
L’interface utilisateur peut être ajustée plus tard
, alors décomposons-la étape par étape.
Pour ajouter un service,
nous ajoutons le fichier de service notification.service.ts
dans app/services
(veuillez utiliser la ligne de commande pour le générer) et ajoutons le contenu associé :
// notification.service.ts importer {Injectable} depuis '@angular/core' ; importer {Observable, Sujet} depuis 'rxjs' ; // Énumération des statuts de notification export enum NotificationStatus { Processus = "progrès", Succès = "succès", Échec = "échec", Terminé = "terminé" } @Injectable({ fourni dans : 'root' }) classe d'exportation NotificationService { notification privée : Subject<NotificationStatus> = new Subject(); message publicObj : any = { primaire: '', secondaire : '' } // Convertir en un public observable getNotification() : Observable<NotificationStatus> { renvoie this.notify.asObservable(); } // Notification en cours public showProcessNotification() { this.notify.next(NotificationStatus.Process) } // Notification de réussite publique showSuccessNotification() { this.notify.next (NotificationStatus.Success) } //Fin de notification publique showEndedNotification() { this.notify.next(NotificationStatus.Ended) } // Modifier les informations public changePrimarySecondary(primaire ? : chaîne, secondaire ? : chaîne) { this.messageObj.primary = primaire ; this.messageObj.secondary = secondaire } constructeur() { } }
Est-ce facile à comprendre...
Nous transformons notify
en un objet observable, puis publions diverses informations d'état.
Pour créer un composant,
nous créons un nouveau composant notification
dans app/components
où les composants publics sont stockés. Vous obtiendrez donc la structure suivante :
notification ├── notification.component.html // Squelette de la page ├── notification.component.scss // Style unique de la page ├── notification.component.spec.ts // Fichier de test └── notification.component.ts // Dans dans le fichier javascript
on définit le squelette de notification
:
<!-- notification.component.html --> <!--Prise en charge de la fermeture manuelle des notifications--> <button (click)="closeNotification()">Fermer</button> <h1>Contenu du rappel : {{ message }}</h1> <!-- Personnaliser les informations de notification clés--> <p>{{primaryMessage }></p> <!-- Personnaliser les informations de notification secondaire--> <p>{{secondaireMessage }></p>
Ensuite, nous modifions simplement le squelette et ajoutons le style suivant :
// notification.component.scss :hôte { poste : fixe ; haut : -100 % ; à droite : 20 px ; couleur d'arrière-plan : #999 ; bordure : 1px solide #333 ; rayon de bordure : 10 px ; largeur : 400 px ; hauteur : 180px ; remplissage : 10 px ; // Faites attention au contenu de active ici. Il n'apparaît que lorsqu'une notification apparaît &.active {. haut : 10px ; } &.succès{} &.progrès {} &.échec {} &.terminé {} }
Les quatre noms de classe de success, progress, failure, ended
correspondent à l'énumération définie par le service de notification. Vous pouvez ajouter des styles associés selon vos propres préférences.
Enfin, nous ajoutons le code javascript
comportemental.
// notification.component.ts importer { Component, OnInit, HostBinding, OnDestroy } depuis '@angular/core' ; //Nouveau point de connaissance rxjs importer { Abonnement } depuis 'rxjs' ; importer {debounceTime} depuis 'rxjs/operators' ; //Introduire les services associés import { NotificationStatus, NotificationService } from 'src/app/services/notification.service'; @Composant({ sélecteur : 'app-notification', templateUrl : './notification.component.html', styleUrls : ['./notification.component.scss'] }) classe d'exportation NotificationComponent implémente OnInit, OnDestroy { // Temps anti-tremblement, lecture seule lecture seule privée NOTIFICATION_DEBOUNCE_TIME_MS = 200 ; notification protégéeAbonnement ! : Abonnement ; minuterie privée : any = null ; message public : chaîne = '' // Mappage du service de notification des informations d'énumération private reflexObj : any = { progression : "en cours", succès : "succès", échec : "échec", terminé : "fin" } @HostBinding('class') notificationCssClass = ''; public PrimaryMessage ! : chaîne ; message secondaire public ! : chaîne ; constructeur( service de notification privé : NotificationService ) { } ngOnInit() : vide { ceci.init() } public init() { //Ajouter des informations d'abonnement pertinentes this.notificationSubscription = this.notificationService.getNotification() .tuyau( debounceTime(this.NOTIFICATION_DEBOUNCE_TIME_MS) ) .subscribe((notificationStatus : NotificationStatus) => { si (état de notification) { this.resetTimeout(); //Ajouter des styles associés this.notificationCssClass = `active ${ notificationStatus }` this.message = this.reflectObj[notificationStatus] // Récupère le message principal personnalisé this.primaryMessage = this.notificationService.messageObj.primary; // Obtenez des informations secondaires personnalisées this.secondaryMessage = this.notificationService.messageObj.secondary; si (notificationStatus === NotificationStatus.Process) { this.resetTimeout() this.timer = setTimeout(() => { ceci.resetView() }, 1000) } autre { this.resetTimeout(); this.timer = setTimeout(() => { this.notificationCssClass = '' ceci.resetView() }, 2000) } } }) } private resetView() : void { ce.message = '' } // Ferme le timer privé resetTimeout() : void { si (ce.timer) { clearTimeout (ce.timer) } } // Ferme la notification publique closeNotification() { this.notificationCssClass = '' this.resetTimeout() } // Le composant est détruit ngOnDestroy() : void { this.resetTimeout(); //Annuler tous les messages d'abonnement this.notificationSubscription.unsubscribe() } }
Ici, nous introduisons le point de connaissance de rxjs . RxJS est une bibliothèque de programmation réactive utilisant Observables
, ce qui facilite l'écriture de code asynchrone ou basé sur le rappel. C'est une excellente bibliothèque, et vous en apprendrez plus à ce sujet dans les prochains articles.
Ici, nous utilisons la fonction anti-shake anti debounce
. La fonction anti-shake signifie qu'après le déclenchement d'un événement, il ne peut être exécuté qu'une fois après n secondes. Si l'événement est à nouveau déclenché dans les n secondes, le temps d'exécution de la fonction sera. recalculé. Pour faire simple : lorsqu’une action est déclenchée en continu, seule la dernière fois est exécutée.
ps : fonction de limitation
throttle
: restreindre l'exécution d'une fonction une seule fois dans un certain laps de temps .
Pendant l'entretien, l'intervieweur aime demander...
Appel
Comme il s'agit d'un service global, nous appelons ce composant dans app.component.html
:
// app.component.html <sortie-routeur></sortie-routeur> <app-notification></app-notification>
Afin de faciliter la démonstration, nous ajoutons un bouton dans user-list.component.html
pour déclencher facilement la démonstration :
// user-list.component.html <button (click)="showNotification()">cliquez sur Afficher la notification</button>
déclenche le code correspondant :
// user-list.component.ts importer {NotificationService } depuis 'src/app/services/notification.service' ; //... constructeur( service de notification privé : NotificationService ) { } //Afficher la notification showNotification() : void { this.notificationService.changePrimarySecondary('Informations primaires 1'); this.notificationService.showProcessNotification(); setTimeout(() => { this.notificationService.changePrimarySecondary('Informations primaires 2', 'Informations secondaires 2'); this.notificationService.showSuccessNotification(); }, 1000) }
À ce stade, nous avons terminé, nous avons simulé avec succès la fonction notification
. Nous pouvons modifier les composants de service associés en fonction des besoins réels et les personnaliser pour répondre aux besoins de l'entreprise. Si nous développons un système à usage interne, il est recommandé d'utiliser des bibliothèques d'interface utilisateur matures. Elles nous ont aidé à encapsuler divers composants et services, nous faisant gagner beaucoup de temps de développement.