我正在构建一个包含许多路由的应用程序,每个路由都定义为一个 NgModule。每个模块都非常相似,因此我想将其抽象为一个可重用的函数,该函数采用一组组件,并构建一个顶层@Component
和@NgModule
.
所以这是其中一个模块:
import { makeModule } from './module-factory';
import { Component } from '@angular/core';
@Component({
selector: 'app-component-1',
template: `<p>First Component</p>`
})
export class FirstComponent {}
@Component({
selector: 'app-component-2',
template: `<p>Second Component</p>`
})
export class SecondComponent {}
export const FooModule = makeModule('foo', [FirstComponent, SecondComponent]);
这是makeModule()
我正在尝试构建的功能:
import { NgModule, Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Route, RouterModule } from '@angular/router';
export const makeEntryComponent = (components: any[]) => {
@Component({
template: `<p>Entry Component</p>
<ng-container *ngFor="let component of components">
<ng-container *ngComponentOutlet="component"></ng-container>
</ng-container>
`
})
class EntryComponent {
components = components;
}
return EntryComponent;
};
export const makeModule = (componentName: string, components: any[]): any => {
const EntryComponent = makeEntryComponent(components);
const routes: Route[] = [{ path: componentName, component: EntryComponent }];
const declarations = [EntryComponent, ...components];
@NgModule({
imports: [CommonModule, RouterModule.forChild(routes)],
declarations,
entryComponents: components,
exports: [EntryComponent]
})
class Module {}
return Module;
};
因此,使用 JIT 编译器可以正常工作,但是一旦我运行ng serve --aot
,它就会失败:
错误中的错误:静态解析符号值时遇到错误。不支持函数调用。考虑将函数或 lambda 替换为对导出函数的引用(原始 .ts 文件中的位置 18:27),解析 C:/Users/IGEN261/code/github/ng-dynamic/src/app/module 中的符号 makeModule -factory.ts,解析 C:/Users/IGEN261/code/github/ng-dynamic/src/app/foo.module.ts 中的符号 FooModule,解析 C:/Users/IGEN261/code/github/ng 中的符号 FooModule -dynamic/src/app/foo.module.ts,解析 C:/Users/IGEN261/code/github/ng-dynamic/src/app/app.module.ts 中的符号 AppModule,解析 C:/Users 中的符号 AppModule /IGEN261/code/github/ng-dynamic/src/app/app.module.ts
我觉得必须有一种方法可以使这与 AOT 保持一致,但我不确定如何。我应该以不同的方式构建我的代码吗?还是我必须放弃此代码库中的任何 DRY 前景以使其与 AOT 兼容?
仅供参考- 完整的项目可在 GitHub 上找到:https ://github.com/mattdsteele/ng-dynamic-aot