如何在Angular 4和@Angular/cli中向NgModule动态添加组件?

如何在Angular 4和@Angular/cli中向NgModule动态添加组件?,angular,angular-cli,Angular,Angular Cli,是否有方法动态地将组件添加到声明和entryComponents属性(Angular 4,Angular/cli 1.1.2) 背景:我创建了一个AppInfo.ts,开发人员可以在其中定义其他组件,这些组件将使用ComponentFactoryResolver(类似于小部件)动态加载。 此AppInfo.ts由静态组件数组(AppInfo.components)组成 如何将此阵列的元素推送到NgModule装饰器 我得到了这个解决方案,它使用ng SERVICE但不使用ng build--pr

是否有方法动态地将组件添加到声明和entryComponents属性(Angular 4,Angular/cli 1.1.2)

背景:我创建了一个AppInfo.ts,开发人员可以在其中定义其他组件,这些组件将使用ComponentFactoryResolver(类似于小部件)动态加载。 此AppInfo.ts由静态组件数组(AppInfo.components)组成

如何将此阵列的元素推送到NgModule装饰器

我得到了这个解决方案,它使用ng SERVICE但不使用ng build--prod:

export const ngmodule={
声明:[……],
入口组件:[],
进口:[……],
引导:[
应用组件
],
提供者:[……]
};
for(设i=0;i
如果我尝试使用ng build--prod构建我的应用程序,我会遇到以下错误:

中出现错误,无法确定/Users/x/Documents/x/src/app/x/x/DynCompExample.component.ts中DynCompExample类的模块!将DynCompExample添加到NgModule以修复它


但是,如果我使用ng serve,它可以正常工作。

我要做的是导出一个组件数组,并在
@NgModule

您可以在内部组件和开发人员组件之间进行拆分

内部.components.ts

export const INTERNAL_COMPONENTS = [
       FooterComponent,
       HeaderComponent,
       SideBarComponent
];
export const DEVELOPER_COMPONENTS = [
       WidgetComponent,
       CustomerComponent,
       NewFeatureComponent
];
Developer.components.ts

export const INTERNAL_COMPONENTS = [
       FooterComponent,
       HeaderComponent,
       SideBarComponent
];
export const DEVELOPER_COMPONENTS = [
       WidgetComponent,
       CustomerComponent,
       NewFeatureComponent
];
然后将它们导入模块文件并使用它们

import {INTERNAL_COMPONENTS} from './Internal.components.ts';
import {DEVELOPER_COMPONENTS} from './Developer.components.ts';

@NgModule({
    declarations: [
        INTERNAL_COMPONENTS,
        DEVELOPER_COMPONENTS
    ],
    exports: [
        INTERNAL_COMPONENTS,
        DEVELOPER_COMPONENTS
    ]
})
export class AppModule {

}

将entry组件保留为单个主组件。

为什么不直接编写
entryComponents:[AppInfo.components],
?我认为您无法将常量变量传递给@NgModule。生产构建不运行模块文件,而是扫描它以提取元数据,以便提前编译。因此,它不知道在上面的代码中要做什么。我想在文档中可以解释这一点。@echonax My AppInfo.components不仅仅是一个组件数组。它的类型为{name:string,component:component}[]。我让这个例子更容易理解。你可以用提供者来做这件事。以路由器和
forRoot
为例,但组件是另一个问题。由于它们有模板,AOT编译需要找到它们并编译模板。请查看是否可以在关闭AOT的情况下进行编译:ng build-prod-AOT=false