国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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
主站蜘蛛池模板: 亚洲欧洲高清 | 国产精品毛片一区二区三区 | 国外欧美一区另类中文字幕 | 日韩精品 欧美 | 午夜视频久久久久一区 | 欧美视频一区二区三区 | 亚洲国产一区二区三区在线观看 | xxx色xxx性 | 日韩v欧美| 国内精品伊人久久大香线焦 | 欧美一区不卡二区不卡三区 | 日韩欧美制服 | 亚洲最新视频在线观看 | 欧美日韩精品一区二区三区视频在线 | 久久91精品国产91久久小草 | 欧美激情伊人 | 欧美日韩国产va另类试看 | 不卡一区二区在线观看 | 日韩欧美综合在线 | 阿v精品一区二区三区 | 日本成人一区 | 国产亚洲一区二区三区 | 亚洲性久久久影院 | 日本不卡一二三区 | 日韩欧美在线观看成人 | 一区高清 | 一区二区免费播放 | 国产成人精品久久二区二区 | 久操久热 | 在线观看国产欧美 | 最新亚洲 | 久久久无码精品亚洲日韩按摩 | 国产一级淫片a免费播放口 国产一级特黄a大片99 | 国内精品视频在线观看 | 亚洲综合一区二区精品久久 | 亚洲欧美日韩三级 | 不卡一级aaa全黄毛片 | 伊人婷婷| 欧美日韩精选 | 国产高清视频在线 | 在线观看网站国产 |