<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 国产亚洲一区二区在线观看| 免费国产高清视频| 国产亚洲综合久久系列| 三年在线观看免费观看完整版中文| 亚洲免费日韩无码系列| fc2成年免费共享视频18| 亚洲情侣偷拍精品| 精品97国产免费人成视频| 国产亚洲色视频在线| 最近中文字幕免费2019| 久久精品国产精品亚洲蜜月| 国产成人久久AV免费| 亚洲一卡2卡4卡5卡6卡在线99| 欧美男同gv免费网站观看 | 国产人成免费视频| 国产一区二区三区亚洲综合| 亚洲美女高清一区二区三区 | 巨波霸乳在线永久免费视频| 亚洲视频一区二区三区| 日韩免费a级毛片无码a∨| 亚洲AV电影天堂男人的天堂| 亚洲国产成人久久笫一页| 97人妻精品全国免费视频| 久久久久亚洲AV无码专区首JN| 久久久久国色AV免费看图片| 一级做a爰片久久毛片免费陪| 亚洲精品制服丝袜四区| 免费人成在线观看69式小视频| 久久亚洲精品国产亚洲老地址| 永久免费看mv网站入口| 久久国产精品免费一区二区三区| 亚洲视频免费在线看| 国产一级理论免费版| 日韩免费高清大片在线| 亚洲乱色伦图片区小说| 国产精品亚洲二区在线观看 | 亚洲成色WWW久久网站| 99在线精品视频观看免费| 免费亚洲视频在线观看| 亚洲国产综合专区在线电影| 国产免费131美女视频|