Angular 2:如何异步地有条件地加载路径中的组件?

Ale*_* JM 20 typescript angular2-router angular

给定条件的情况下,我想异步地将一个组件附加到路由.

以下示例(可以是异步的)根据用户角色加载一个或另一个组件:

import { UserDashboardComponent }  from './user-dashboard.component'
import { AdminDashboardComponent } from './admin-dashboard.component'

const role = 'admin' // Just for the example
const comp = role === 'admin' ? AdminDashboardComponent : UserDashboardComponent

const routes: Routes = [
  { path: '', component: comp },
]
Run Code Online (Sandbox Code Playgroud)

但是,假设我们想要从API检索角色,从而异步.有什么方法可以实现这一目标?

Bhu*_*kar 9

您可以创建一个generic.module.ts,它将在声明数组中包含两个组件:

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { UserDashboardComponent }  from './user-dashboard.component'
import { AdminDashboardComponent } from './admin-dashboard.component    

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ UserDashboardComponent,AdminDashboardComponent ]
})
export class GenericModule { }
Run Code Online (Sandbox Code Playgroud)

这样,您将拥有一个包含要加载的模块的模块.

现在,下一步将使用编译器异步加载它们:在组件内部执行以下操作:

import {GenericModule} from './generic.module';
import { Component, Input,ViewContainerRef, Compiler, NgModule,ModuleWithComponentFactories,OnInit,ViewChild} from '@angular/core';
@Component({
  selector: 'generic',
  template: '<div #target></div>'
})
export class App implements AfterViewInit {
  @ViewChild('target', {read: ViewContainerRef}) target: ViewContainerRef;

  constructor(private compiler: Compiler) {}

  ngAfterViewInit() {
    this.createComponent('<u>Example template...</u>');
  }

  private createComponent(template: string,role:string) {
    @Component({template: template});
    const mod = this.compiler.compileModuleAndAllComponentsSync(GenericModule);
    const factory = mod.componentFactories.find((comp) =>
    //you can add your comparison condition here to load the component
    //for eg. comp.selector===role where role='admin'
    );
    const component = this.target.createComponent(factory);
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Man*_*ith 8

Angular 2支持模块级别的延迟加载.功能模块是异步加载的,而不是组件.您可以制作该组件功能模块. https://angular.io/docs/ts/latest/guide/ngmodule.html

  • 对不起,我想我没有正确表达自己.我强调"异步",但我的问题更多的是关于"条件".延迟加载与我的问题没有"直接"关系.我的问题是如何加载一个或另一个组件(或一个或另一个模块),具体取决于应用程序加载时可能是异步的条件(假设条件是来自API的用户角色).我已经更新了我的问题,使其更清晰.有办法解决这个问题吗? (2认同)