我的.component.ts
import { AfterViewInit, Compiler, Component, Input,
NgModule, OnInit, ViewChild, ViewContainerRef } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-my',
templateUrl: './my.component.html',
styles: []
})
export class MyComponent implements OnInit, AfterViewInit {
@Input() template: string;
@Input() styles: string[];
@ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;
constructor(private route: ActivatedRoute, private compiler: Compiler) {}
ngOnInit() {
this.route.data
.subscribe((data: {template: string, styles?: string[]}) => {
this.template = data.template;
this.styles = data.styles || [];
});
}
// https://github.com/angular/angular/issues/15275#issuecomment-434793800
ngAfterViewInit() {
// Must clear cache.
this.compiler.clearCache();
// Define the component using Component decorator.
const component = Component({
template: this.template,
styles: this.styles
})(class {});
// Define the module using NgModule decorator.
const module = NgModule({
declarations: [component]
})(class {});
// Asynchronously (recommended) compile the module and the component.
this.compiler.compileModuleAndAllComponentsAsync(module)
.then(factories => {
// Get the component factory.
const componentFactory = factories.componentFactories[0];
// Create the component and add to the view.
const componentRef = this.container.createComponent(componentFactory);
});
}
}
我的.routes.ts
import { Routes } from '@angular/router';
import { MyComponent } from './my.component';
export const myRoutes: Routes = [
{ path: '', component: MyComponent,
data: { template: 'hello' } },
{ path: 'foo', component: MyComponent,
data: { template: 'foo', styles: [':host {color: red}'] } },
{ path: 'bar', component: MyComponent,
data: { template: 'bar', styles: [':host {color: blue}'] } },
{ path: 'can', component: MyComponent,
data: { template: 'can', styles: [':host {color: green}'] } }
];
我的.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { MyComponent } from './my.component';
import { myRoutes } from './my.routes';
@NgModule({
declarations: [MyComponent],
imports: [CommonModule, RouterModule, RouterModule.forChild(myRoutes)],
providers: []
})
export class MyModule {}