如何實現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 -->
相關文章
- bootstrap中的模態框(modal,彈出層)boot
- 實現彈框的樣式
- Bootstrap modal模態框彈出瞬間又消失boot
- 小程式自定義modal彈窗封裝實現封裝
- react封裝一個可自定義內容的modal彈框元件React封裝元件
- Bootstrap模態框(Modal)boot
- Vue+iview Modal元件關閉彈框之後報錯問題VueView元件
- html + css + js 原生 彈出提示框的實現HTMLCSSJS
- CSS實現滑鼠移入彈出下拉框CSS
- swift實現仿知乎搖一搖彈出框Swift
- 彈框
- 如何實現特殊的邊框樣式
- 彈框 在Avalonia中,使用系統預設的彈框
- antdv彈窗modal可拖動方法
- 純 CSS 打造一個模態(modal)框CSS
- iView之Modal(一級彈窗和二級彈窗)View
- 如何實現彈性架構架構
- TextView自定義輕鬆實現下劃線、點選彈框TextView
- 設定bootstrap modal模態框的寬度和寬度boot
- 函式式元件中實現Antd開啟Modal後其Input框自動聚焦(focus)到文字的最後函式元件
- vue2 - element彈框自定義指令 實現拖動、縮放Vue
- Ant Design 中 對話方塊Modal 作為詳情彈框展示 右下角只需一個按鈕
- 短視訊直播系統,Vue實現element-ui彈框可以拖拽VueUI
- 如何實現css漸變圓角邊框CSS
- Android懸浮框的實現Android
- Selenium彈框處理
- vue封裝彈框Vue封裝
- 仿IOS底部彈框iOS
- 頁面table彈框
- 詳細介紹React模態框元件react-modalReact元件
- 如何比較版本號--Python實現Python
- axure教程:如何實現數字輸入框效果
- 論如何用Vue實現一個彈窗-一個簡單的元件實現Vue元件
- 如何使用 Kubernetes 實現應用程式的彈性伸縮
- 如何實現廣告彈窗觸達頻率的控制?
- 這樣使用React彈窗會更方便 -- use-modalReact
- 公司需求系列:js封裝一個移動端modal框JS封裝
- 如何使用PHP彈出警告訊息框(示例詳解)PHP
- 解決select2 在modal中搜尋框無效的問題