AOT编译
按照 Angular 官方的 Aot 编译流程即可。
多Tab页
在后台系统中,多Tab页是比较常用了。但是多Tab页,在单页中使用,会有一定的性能风险,这个依据实际的情况,进行使用。实现多Tab页的核心就是如何动态加载组件以及如何获取到要加载的组件。
多Tab页面,实际就是一个 Tabset 组件,只是在 tab-item 的实现稍显特别一些,相关动态加载的源码:
@ViewChild('dynamicComponentContainer', { read: ViewContainerRef }) dynamicComponentContainer: ViewContainerRef; constructor( private elementRef: ElementRef, private renderer: Renderer2, private tabset: TabsetComponent, private resolver: ComponentFactoryResolver, private parentContexts: ChildrenOutletContexts ) { } public destroy() { let el = this.elementRef.nativeElement as HTMLElement; // tslint:disable-next-line:no-unused-expression el.parentNode && (el.parentNode.removeChild(el)); } private loadComponent(component: any) { let context = this.parentContexts.getContext(PRIMARY_OUTLET); let injector = ReflectiveInjector.fromResolvedProviders([], this.dynamicComponentContainer.injector); const resolver = context.resolver || this.resolver; let factory = resolver.resolveComponentFactory(component); // let componentIns = factory.create(injector); // this.dynamicComponentContainer.insert(componentIns.hostView); this.dynamicComponentContainer.createComponent(factory); }
注意:要考虑组件卸载方法,如 destroy()
为了获取到当前要渲染的组件,我们可以借用路由来抓取:
this.router.events.subscribe(evt => { if (evt instanceof NavigationEnd) { let pageComponent; let pageName; try { let nextRoute = this.route.children[0].children[0]; pageName = this.location.path(); pageComponent = nextRoute.component; } catch (e) { pageName = '$$notfound'; pageComponent = NotFoundComponent; } let idx = this.pageList.length + 1; if (!this.pageList.find(x => x.name === pageName)) { this.pageList.push({ header: `页面${idx}`, comp: pageComponent, name: pageName, closable: true }); } setTimeout(() => { this.selectedPage = pageName; }); } });
3、总结
以上就是大概的实现思路以及部分相关的细节。其他细节就需要根据实际的情况,进行酌情处理。
该思路并不仅限于 Angular 框架,使用 Vue、React 也可以做到类似的效果。同时,这套东西也比较适合中小企业的后台平台(不一定非要多团队,一个团队按模块开发也是不错的)。
如需要了解更多细节,可以参考:ngx-modular-platform,能给个 star 就更好了。
本文github地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持黑区网络。