Maison > Article > interface Web > Terminer l'écriture du composant Message en utilisant angulaire
Cet article présente principalement comment écrire une version angulaire du composant Message. L'éditeur pense que c'est plutôt bien, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur et jetons un coup d'œil
La meilleure façon d'apprendre un framework ou une bibliothèque est de lire la documentation officielle et de commencer à écrire des exemples. J'ai récemment utilisé mon temps libre pour apprendre Angular, donc aujourd'hui je vais essayer d'écrire un composant de message et de charger dynamiquement le composant de message via le service de messagerie.
Les projets auxquels je participe sont essentiellement réalisés en utilisant jquery. Auparavant, j'écrivais moi-même un simple plug-in de message dans le projet, comme indiqué ci-dessous.
Utilisez maintenant angulaire (version 5.0.0) pour implémenter le composant de message.
Composant du message
Le composant du message doit être affiché en fonction du type, du message et de la durée entrants. Créez trois fichiers : message.component.ts, message.component.html, message.component.css, le code est le suivant.
//message.component.ts import {Component,Input,OnInit,ChangeDetectionStrategy} from '@angular/core'; import { trigger, state, style, transition, animate } from '@angular/animations'; const mapping={ success:'glyphicon-ok-sign', warning:'glyphicon-exclamation-sign', error:'glyphicon-exclamation-sign', info:'glyphicon-ok-circle' } @Component({ selector:'upc-ng-message', templateUrl:'./message.component.html', styleUrls:['./message.component.css'], changeDetection:ChangeDetectionStrategy.OnPush }) export class MessageComponent implements OnInit{ ngOnInit(): void { this.typeClass=['upc-message-' + this.msgType]; this.typeIconClass=[mapping[this.msgType]]; } @Input() msgType:'success' | 'info' | 'warning' | 'error'='info' @Input() payload:string = '' private typeClass private typeIconClass }
<!--*message.component.html--> <p class="upc-message"> <p class="upc-message-content" [ngClass]="typeClass"> <i class="glyphicon" [ngClass]="typeIconClass"></i> {{payload}} </p> </p>
.upc-message { position: fixed; z-index: 1999; width: 100%; top: 36px; left: 0; pointer-events: none; padding: 8px; text-align: center; } .upc-message i { margin-right: 8px; font-size: 14px; top: 1px; position: relative; } .upc-message-success i { color: green; } .upc-message-warning i { color: yellow; } .upc-message-error i { color: red; } .upc-message-content { padding: 8px 16px; -ms-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 2px 8px #000000; -ms-box-shadow: 0 2px 8px #000000; box-shadow: 0 2px 8px #000000; box-shadow: 0 2px 8px rgba(0,0,0,.2); background: #fff; display: inline-block; pointer-events: all; }
ComponentLoader
Grâce à la section des composants dynamiques du document officiel, vous pouvez comprendre que la création dynamique de composants doit être complétée via ComponentFactoryRésolveur. Utilisez ComponentFactoryResolver pour créer un ComponentFactory, puis créez des composants via la méthode create de ComponentFactory. En regardant la description de l'API dans le document officiel, la méthode create de ComponentFactory nécessite au moins un paramètre d'injecteur, et la création de l'injecteur est également mentionnée dans le document, où le paramètre supplier est la classe qui doit être injectée. Trions tout le processus :
Fournir des fournisseurs
Créer une instance d'injecteur
Créer une ComponentFactory
Utilisez ComponetFactory pour créer ComponentRef
//ComponentFactory的create方法 create(injector: Injector, projectableNodes?: any[][], rootSelectorOrNode?: string|any, ngModule?: NgModuleRef<any>): ComponentRef<C> //使用Injector的create创建injector实例 static create(providers: StaticProvider[], parent?: Injector): Injector
Pour la réutilisation du code, une classe de chargeur générale est créée ici pour compléter la création dynamique des composants . Parmi eux, la méthode attch est utilisée pour initialiser ComponentFactory (le paramètre est le type de composant) ; la méthode to est utilisée pour identifier le conteneur parent du composant ; la méthode supplier est utilisée pour initialiser la classe injectable ; utilisé pour créer des composants et détecter manuellement les modifications ; la méthode de suppression est utilisée pour supprimer des composants.
import { ComponentFactoryResolver, ComponentFactory, ComponentRef, Type, Injector, Provider, ElementRef } from '@angular/core'; export class ComponentLoader<T>{ constructor(private _cfr: ComponentFactoryResolver, private _injector: Injector) { } private _componentFactory: ComponentFactory<T> attch(componentType: Type<T>): ComponentLoader<T> { this._componentFactory = this._cfr.resolveComponentFactory<T>(componentType); return this; } private _parent: Element to(parent: string | ElementRef): ComponentLoader<T> { if (parent instanceof ElementRef) { this._parent = parent.nativeElement; } else { this._parent = document.querySelector(parent); } return this; } private _providers: Provider[] = []; provider(provider: Provider) { this._providers.push(provider); } create(opts: {}): ComponentRef<T> { const injector = Injector.create(this._providers as any[], this._injector); const componentRef = this._componentFactory.create(injector); Object.assign(componentRef.instance, opts); if (this._parent) { this._parent.appendChild(componentRef.location.nativeElement); } componentRef.changeDetectorRef.markForCheck(); componentRef.changeDetectorRef.detectChanges(); return componentRef; } remove(ref:ComponentRef<T>){ if(this._parent){ this._parent.removeChild(ref.location.nativeElement) } ref=null; } }
En même temps, afin de faciliter la création de loader, créez la classe LoaderFactory, le code est le suivant :
import { ComponentFactoryResolver, Injector, Injectable, ElementRef } from '@angular/core'; import { ComponentLoader } from './component-loader.class'; @Injectable() export class ComponentLoaderFactory { constructor(private _injector: Injector, private _cfr: ComponentFactoryResolver) { } create<T>(): ComponentLoader<T> { return new ComponentLoader(this._cfr, this._injector); } }
service de messages
service de messagerie Fournit une API pour afficher les messages. Le code est le suivant :
import {Injectable,Injector} from '@angular/core'; import { ComponentLoaderFactory } from '../component-loader/component-loader.factory'; import {MessageComponent} from './message.component'; import {ComponentLoader} from '../component-loader/component-loader.class'; @Injectable() export class MessageService{ constructor(private _clf:ComponentLoaderFactory,private _injector:Injector){ this.loader=this._clf.create<MessageComponent>(); } private loader:ComponentLoader<MessageComponent> private createMessage(t,c,duration=2000){ this.loader.attch(MessageComponent).to('body'); const opts = { msgType: t, payload:c }; const ref = this.loader.create(opts); ref.changeDetectorRef.markForCheck(); ref.changeDetectorRef.detectChanges(); let self=this; let st = setTimeout(() => { self.loader.remove(ref); }, duration); } public info(payload,duration?) { this.createMessage('info',payload,duration); } public success(payload,duration?) { this.createMessage('success',payload,duration); } public error(payload,duration?) { this.createMessage('error',payload,duration); } public warning(payload,duration?) { this.createMessage('warning',payload,duration); } }
message.module
Enfin, ajoutez un message. .module.ts. N'oubliez pas d'ajouter des composants créés dynamiquement au tableau EntryComponents.
import {NgModule} from '@angular/core'; import { CommonModule } from '@angular/common'; import {MessageComponent} from './message.component'; import {MessageService} from './message.service'; import {ComponentLoaderFactory} from '../component-loader/component-loader.factory'; @NgModule({ imports:[CommonModule], declarations:[MessageComponent], providers:[MessageService,ComponentLoaderFactory], entryComponents:[MessageComponent], exports:[MessageComponent] }) export class MessageModule{ }
Utilisez la méthode
pour injecter MessageService et appeler l'API pour utiliser le composant Message.
this._msgService.success('成功了!');
J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.
Articles associés :
Comment obtenir l'effet de boîte d'affichage dans le composant Vue Toast
À propos du traitement des paramètres de règles dans webpack
Comment implémenter des calculs simples dans AngularJS
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!