亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

動手寫一個angular版本的Message組件的方法

2019-11-19 14:43:21
字體:
來源:轉載
供稿:網友

學習一個框架或庫的最好方法是看官方文檔,并著手去寫例子。最近在利用空閑的時間學習angular,那今天就嘗試寫一個message組件,并通過message服務動態加載message組件。
我所參與的項目基本是用jquery完成的。之前,在項目中自己動手寫過一個簡單的message插件,樣子如下圖。

那現在就使用angular(版本5.0.0)來實現message組件。

message組件

message組件要根據傳入的類型、消息和duration來顯示。創建三個文件:message.component.ts,message.component.html,message.component.css,代碼如下。

//message.component.tsimport {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--><div class="upc-message">    <div class="upc-message-content" [ngClass]="typeClass">      <i class="glyphicon" [ngClass]="typeIconClass"></i>      {{payload}}    </div></div>
.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

通過官方文檔動態組件一節,可以了解動態創建組件需要通過ComponentFactoryResolver來完成。使用ComponentFactoryResolver創建ComponentFactory,再通過ComponentFactory的create方法創建組件。看官方文檔中API的說明,ComponentFactory的create方法至少需要一個injector參數,而injector的創建在文檔中也有提到,其中參數providers為需要注入的類。再梳理下整個過程:

  1. 提供providers
  2. 創建Injector實例
  3. 創建ComponetFactory
  4. 使用ComponetFactory創建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

為了代碼的復用,這里創建通用的loader類來完成組件的動態創建。其中,attch方法用于初始化ComponetFactory(參數為組件類型);to方法用于標識組件的父容器;provider方法用于初始化可注入的類;create方法用于創建組件并手動變更檢測;remove方法用于移除組件。

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;  }}

同時,為了便于loader的創建,再創建LoaderFactory類,代碼如下:

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);  }}

message service

message service提供顯示message的API,代碼如下:

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

最后,增加message.module.ts。記得要把動態創建的組件添加到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{}

使用方法

注入MessageService,調用API使用Message組件。

this._msgService.success('成功了!');

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91禁国产网站| 正在播放国产一区| 国内精品视频一区| 91久久国产精品| 亚洲一区二区三区777| 日韩av资源在线播放| 日本精品一区二区三区在线| 欧美视频精品一区| 国产日韩欧美在线视频观看| 中国china体内裑精亚洲片| 国产欧美日韩免费| 在线观看日韩视频| 国模私拍视频一区| 最近免费中文字幕视频2019| 久久久久久一区二区三区| 亚洲欧美国产va在线影院| 成人性生交大片免费观看嘿嘿视频| 欧美激情欧美狂野欧美精品| 国产日韩欧美在线看| 成人免费在线视频网址| 亚洲精品中文字幕有码专区| 亚洲欧美成人网| 国产精品国产自产拍高清av水多| 黑人巨大精品欧美一区二区三区| 日韩av电影在线播放| 久久久免费观看视频| 欧美精品手机在线| 亚洲电影免费观看高清完整版在线观看| 久久久国产精品视频| 国产色综合天天综合网| 亚洲精品国产精品久久清纯直播| 91精品国产免费久久久久久| 欧美性在线视频| 欧美色videos| 久久色精品视频| 欧美精品久久久久久久久久| 久久精品青青大伊人av| 精品国产依人香蕉在线精品| 国内免费久久久久久久久久久| 亚洲最大成人网色| 日韩精品极品视频免费观看| 久久久久亚洲精品成人网小说| 日韩视频免费看| 2021久久精品国产99国产精品| 日韩成人网免费视频| 亚洲综合最新在线| 欧美精品videosex性欧美| 欧美激情视频网址| 亚洲国产又黄又爽女人高潮的| 欧美一区亚洲一区| 最新国产成人av网站网址麻豆| 国产中文字幕日韩| 国产综合久久久久久| 日韩欧美黄色动漫| 黑人精品xxx一区一二区| 日本老师69xxx| 欧美在线免费视频| 欧美电影免费在线观看| 亚洲国产欧美久久| 日韩av一区二区在线观看| 亚洲国产精品成人av| 久久久免费av| 国产精品老牛影院在线观看| 欧美日韩国产在线看| 九九九热精品免费视频观看网站| 午夜欧美大片免费观看| 国内精品小视频在线观看| 在线观看免费高清视频97| 4438全国成人免费| 欧美夜福利tv在线| 北条麻妃99精品青青久久| 全球成人中文在线| 日韩免费视频在线观看| 欧美华人在线视频| 欧美日韩国产在线播放| 午夜精品免费视频| 日韩在线观看免费全| 欧美一级视频一区二区| 久久综合九色九九| 亚洲一区二区三区视频播放| 国产精品白丝jk喷水视频一区| 久久天堂电影网| 国外成人性视频| 成人xxxx视频| 亚洲欧美日韩精品久久奇米色影视| 欧美主播福利视频| 精品久久久久久| 久久久久久久久久久国产| 亚洲精品福利在线观看| 17婷婷久久www| 动漫精品一区二区| 日韩欧美国产高清91| 欧美成人免费大片| 国产伦精品免费视频| 国产精品久久久久久久久久免费| 欧美又大又硬又粗bbbbb| 国产精品国产三级国产专播精品人| 欧美激情亚洲另类| 欧美亚洲第一区| 亚洲综合中文字幕在线| 疯狂蹂躏欧美一区二区精品| 亚洲视频在线免费观看| 日韩精品中文字幕久久臀| 亚洲色图综合网| 91九色国产在线| 亚洲视频axxx| 日韩久久免费电影| 伊人青青综合网站| 国产日韩欧美在线播放| 欧美性猛交xxxx久久久| 欧洲成人免费视频| 欧美特级www| 国产精品自拍网| 欧美精品在线视频观看| 亚洲精品乱码久久久久久金桔影视| 亚洲影院色无极综合| 久久久久久久久久国产精品| 92看片淫黄大片看国产片| 国产成人精品日本亚洲| 亚洲图片在线综合| 成人激情视频小说免费下载| 欧美肥臀大乳一区二区免费视频| 亚洲精品久久久久久下一站| 欧美精品亚州精品| 一区二区中文字幕| 国产精品视频内| 97香蕉久久超级碰碰高清版| 欧美日韩中文字幕在线| 精品国产自在精品国产浪潮| 97色在线视频观看| 亚洲国产精品va在线观看黑人| 91久久久久久久久久久久久| 国产成人综合亚洲| 91精品国产99久久久久久| 久久电影一区二区| 亚洲毛片一区二区| 欧美黑人xxxⅹ高潮交| 亚洲丝袜一区在线| 国产在线视频欧美| 午夜精品蜜臀一区二区三区免费| 亚洲视频日韩精品| 国产精品视频久久| 亚洲韩国日本中文字幕| 国产男人精品视频| 国产日韩欧美一二三区| 欧日韩在线观看| 日韩精品在线观| 亲爱的老师9免费观看全集电视剧| 大量国产精品视频| 97热在线精品视频在线观看| 日韩精品视频免费在线观看| 欧美丝袜美女中出在线| 2019最新中文字幕| 欧美午夜www高清视频| 亚洲一区二区自拍| 国产精品一区二区3区| 九色精品免费永久在线| 亚洲欧美综合图区| 亚洲free性xxxx护士hd| 亚洲色图五月天| 欧美黑人巨大精品一区二区| 亚洲欧美综合精品久久成人| 国产精品久久激情| 国产精品极品美女粉嫩高清在线|