• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

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

    來源:懂視網 責編:小采 時間:2020-11-27 22:23:35
    文檔

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

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

    學習一個框架或庫的最好方法是看官方文檔,并著手去寫例子。最近在利用空閑的時間學習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.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-->
    <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('成功了!');

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产欧美日本亚洲精品一5| 久久无码人妻精品一区二区三区| 国产精品999| 亚洲av无码成人精品区在线播放 | 精品伦精品一区二区三区视频| 久久精品欧美日韩精品| 老司机精品影院91| 国产午夜精品一本在线观看| 国产成人精品视频在放| 色欲国产麻豆一精品一AV一免费 | 成人国产精品免费视频| 一本色道久久88精品综合| 国产午夜福利精品久久| 国产精品一二三区| 国产精品人成在线播放新网站| 亚洲精品无码鲁网中文电影| 欧美激情精品久久久久久久| 国产精品99久久久久久董美香| 久久99精品国产99久久6男男| 999精品视频| avtt天堂网久久精品| 精品熟女少妇a∨免费久久| 亚洲综合无码精品一区二区三区| 日本欧美国产精品第一页久久| 国产精品美女久久久久AV福利| 秋霞久久国产精品电影院| 国产精品亚洲片在线va| 99久久久精品| 国产精品久久久久9999高清| 国产精品宾馆在线精品酒店| 国产精品亚洲片在线va| 国产一区二区精品久久| 久久精品九九亚洲精品天堂| 国产欧美国产精品第一区| 国产福利微拍精品一区二区| 国产成人精品免费视频大| 91精品国产91久久久久福利| 国产91精品在线| 四虎国产精品免费入口| 高清在线国产午夜精品| 国产国拍亚洲精品福利|