如何實現angular2版本的modal彈框
最近看angular2專案程式碼時發現專案中modal的使用形式是,哪裡需要modal就寫在哪裡,modal嵌入在Dom樹中的很深層而不是在直接掛在body下,這樣會導致很大的問題。產生問題原因可以產看該連結:http://web.jobbole.com/92121/。
於是就想自己寫一個能直接在掛在body底下的modal。
那麼怎麼實現能?通過傳統component,其存在於component樹中顯然無法隨意改變component在樹中的結構,好在我們有dynamic component,通過它我們能自主建立其例項並自主決定其掛載的位置,比如我們要掛載至body下。
具體實現如下,為了圖方便自己基於jquery和bootstrap3實現(基於原生實現原理相同),原理:動態例項化元件,將元件dom掛至body下。刪除時destroy component ,移除dom
import {
ComponentFactoryResolver,
ComponentRef,
ReflectiveInjector,
ApplicationRef,
Injectable,
EventEmitter,
} from '@angular/core';
@Injectable()
export class ModalService {
private modals: Modal[] = [];
constructor(private componentFactoryResolver: ComponentFactoryResolver,
private applicationRef: ApplicationRef) { }
create(component) {
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);
const injector = ReflectiveInjector.resolveAndCreate([]);
const componentRef = componentFactory.create(injector);
this.applicationRef.attachView(componentRef.hostView);
document.body.appendChild(componentRef.location.nativeElement);
const modal = new Modal(componentRef);
this.modals.push(modal);
return modal;
}
destory(modal: Modal) {
modal.hide();
this.modals.splice(this.modals.indexOf(modal), 1);
modal.$el.remove();
modal.componentRef.destroy();
}
}
export class Modal {
$el;
$modalEl;
public componentRef;
public onShown = new EventEmitter();
public onHidden = new EventEmitter();
constructor(componentRef) {
this.$el = $(componentRef.location.nativeElement);
this.$modalEl = this.$el.find('.modal');
this.componentRef = componentRef;
this.$modalEl.on('shown.bs.modal', (e)=>{
this.onShown.emit(e);
});
this.$modalEl.on('hidden.bs.modal',(e)=>{
this.onHidden.emit(e);
});
}
show() {
this.$modalEl.modal('show');
}
hide() {
this.$modalEl.modal('hide');
}
}
使用
this.modal = this.modal || this.modalService.create(SelectDeviceModalComponent);
this.modal.show();
this.modal.onHidden.subscribe((e) => {
this.modalService.destory(this.modal);
this.modal = null;
});
注意由於是基於bootstrap的實現所以。create中傳的元件的html必須是bootstrap的modal形式,例如:
<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="gridSystemModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="gridSystemModalLabel">Modal title</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
相關文章
- modal模態框的實現
- bootstrap中的模態框(modal,彈出層)boot
- 實現彈框的樣式
- Bootstrap modal模態框彈出瞬間又消失boot
- 小程式自定義modal彈窗封裝實現封裝
- react封裝一個可自定義內容的modal彈框元件React封裝元件
- Bootstrap模態框(Modal)boot
- Vue+iview Modal元件關閉彈框之後報錯問題VueView元件
- CSS實現滑鼠移入彈出下拉框CSS
- html + css + js 原生 彈出提示框的實現HTMLCSSJS
- 使用easydrag實現可拖動的DIV彈出框
- swift實現仿知乎搖一搖彈出框Swift
- 基於HTML5 Canvas 實現彈出框HTMLCanvas
- Android 用PopupWindow實現彈出警告框的複用類Android
- 彈框
- 如何實現特殊的邊框樣式
- antdv彈窗modal可拖動方法
- iView之Modal(一級彈窗和二級彈窗)View
- 如何實現彈性架構架構
- 彈框 在Avalonia中,使用系統預設的彈框
- 純 CSS 打造一個模態(modal)框CSS
- TextView自定義輕鬆實現下劃線、點選彈框TextView
- 專案需求討論-仿ios底部彈框實現及分析iOS
- Bootstrap(v3.2.0)模態框(modal)垂直居中boot
- javascript實現的點選彈出刪除提示框程式碼例項JavaScript
- AlertDialogActivity彈框
- Sui 彈框固定UI
- 設定bootstrap modal模態框的寬度和寬度boot
- javascript實現點選彈出確認刪除警告框程式碼JavaScript
- vue2 - element彈框自定義指令 實現拖動、縮放Vue
- 函式式元件中實現Antd開啟Modal後其Input框自動聚焦(focus)到文字的最後函式元件
- 如何實現css漸變圓角邊框CSS
- css如何實現只保留內部邊框CSS
- 如何實現廣告彈窗觸達頻率的控制?
- 如何用 Swift 實現一個好玩的彈性動畫Swift動畫
- 短視訊直播系統,Vue實現element-ui彈框可以拖拽VueUI
- 點選提交按鈕實現彈出警告框表單驗證效果
- vue封裝彈框Vue封裝