- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下一段 Angular 代码:
dashboard.component.ts
import {Component, AfterViewInit, ComponentFactoryResolver, ViewContainerRef, OnInit, Input} from "@angular/core";
import {WidgetItem} from "../modules/widget-item";
import {WidgetComponent} from "../modules/widget.component";
import {DashboardService} from "./dashboard.service";
@Component({
selector: 'dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent implements OnInit, AfterViewInit {
@Input() widgets: WidgetItem[];
constructor(
private dashboardService: DashboardService,
private componentFactoryResolver: ComponentFactoryResolver,
private viewContainerRef: ViewContainerRef
) {}
ngOnInit(): void {
this.widgets = this.dashboardService.getWidgets();
}
ngAfterViewInit(): void {
this.loadDashboard();
}
private loadDashboard(): void {
this.viewContainerRef.clear();
if(this.widgets) {
for (let widget of this.widgets) {
let componentFactory = this.componentFactoryResolver.resolveComponentFactory(widget.component);
let componentRef = this.viewContainerRef.createComponent(componentFactory);
(<WidgetComponent>componentRef.instance).data = widget.data;
}
}
}
}
和 dashboard.service.ts
import {Injectable} from '@angular/core';
import {WidgetItem} from "../modules/widget-item";
@Injectable()
export class DashboardService {
private dashboardWidgets: WidgetItem[];
constructor() {
this.dashboardWidgets = [];
}
getWidgets() {
console.log('get widgets');
return this.dashboardWidgets;
}
addWidget(widget: WidgetItem): void {
console.log('add widget', widget);
this.dashboardWidgets.push(widget);
}
}
和contract-widget.component.ts
import {Component} from "@angular/core";
import {WidgetComponent} from "./widget.component";
@Component({
selector: 'contract-widget',
templateUrl: './contract-widget.component.html'
})
export class ContractWidgetComponent implements WidgetComponent {
data: any;
}
和widget.component.ts
export interface WidgetComponent {
data: any;
}
和widget-item.ts
import {Type} from "@angular/core";
export class WidgetItem {
constructor(public component: Type<any>, public data:any) {}
}
我尝试做的是使用 componentfactoryresolver 将小部件动态加载到我的仪表板上。当我手动将 ContractWidgetComponent 添加到我的 app.component entryComponents 时,这非常有效。但是,我想要完成的是,我可以在不知道它们存在于我的应用程序中的情况下将小部件加载到我的仪表板上。我已经分离了代码,所以我的文件夹结构如下所示:
/app -- contains app.module.ts, app-routing.module.ts and app.component.ts
/app/parts -- contains dahsboard.component.ts and dahsboard.service.ts
/app/modules -- contains contract-widget.component.ts widget.component.ts and widget-item.ts
在我的小部件中,我还设置了一个组件,因此我可以将该组件用作 loadChildren 来动态加载该组件。 (在我的应用程序/模块中,我确实有更多代码与其他组件和服务一起用于特定功能,这里不需要解释我的问题)。
我想做的是能够在我的/app/modules 中开发另一个模块,只需在那里添加所需的文件,让我的仪表板能够在我的模块中显示任何新的小部件,而无需更改我/app 或/app/parts 目录。
主要部分工作正常,但是当我尝试使用 loadDashboard()
将小部件加载到仪表板上时,出现以下错误:
ERROR Error: Uncaught (in promise): Error: No component factory found for ContractWidgetComponent. Did you add it to @NgModule.entryComponents?
Error: No component factory found for ContractWidgetComponent. Did you add it to @NgModule.entryComponents?
这是有道理的,因为我不想将 ContractWidgetComponent 添加到我的/app/app.module.ts entryComponents 数组,因为我的应用不知道我将拥有什么类型的小部件(将来)。
有什么方法可以在运行时 以编程方式将 ContractWidgetComponent 添加到我的 entryComponent 中,以便我可以在我的仪表板上动态加载我的小部件?
如有任何帮助,我们将不胜感激。
最佳答案
What I want to do is to be able to develop another module inside my /app/modules and just add the needed files there and have my dashboard be able to just display any new widget in my modules without changing code in my /app or /app/parts directory.
是的,你可以做到。只需使用模块声明中指定的 contract-widget.component.ts
定义一个模块,动态加载该模块并使用 compileModuleAndAllComponentsAsync
编译器 API 生成模块的所有工厂。然后您可以访问这些工厂并动态实例化组件。
有关详细信息,请阅读 Here is what you need to know about dynamic components in Angular
关于angular - 如何将项目添加到 NgModule entryComponents 运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44562162/
我正在使用 Angular Cli 创建组件。 我正在使用这个命令: ng g c DeviceComponent --module=./views/administration/Accounting
我想从组件加载模态。在 Angular Material 文档中,编写了在 entryComponents 中添加模态组件: 这个: @NgModule({ imports: [ Comm
我正在使用 Angular 8,我想在我的项目中延迟加载对话框。执行此操作时出现以下错误:- No component factory found for EditProfileComponent.
import {Component} from '@angular/core'; import {IonicPage, NavController, NavParams} from 'ionic-an
我有一个代码: ////////////////login.module.ts import { NgModule } from '@angular/core'; import { IonicPage
我有 ngx-bootstrap 模态组件。此模式在 shared 文件夹中使用。我在我的 DashboardModule 中使用这个 FirstModalComponent,例如: // Dashb
您好,我是 angular2 和 typescript 的新手。我正在动态加载组件,我想知道是否有一种方法可以使用模块的“声明”和“entryComponents”中的服务来声明我的组件。 使用 ty
例如,假设您有以下组件: import { Another } from "./Another"; @Component({ entryComponents: [ Anothe
这里我有一个方法“confirmSth”,动态加载了一个组件“SnackCheckBoxComponent”。 我想知道我是否可以在我的 OrderDetailComponent 中获取一些消息来区分
我有以下一段 Angular 代码: dashboard.component.ts import {Component, AfterViewInit, ComponentFactoryResolver
我的 app.module.ts 中有这个: import { BrowserModule } from '@angular/platform-browser'; import { ErrorHand
我有一个组件,它接收组件的组件类以动态创建为子组件。 let componentFactory = this.componentFactoryResolver.resolveComponentFact
我在 Angular 6 中使用 ng-bootstrap 模态时遇到问题。 首先,我有 2 个模块: AppModule 和 ComponentModule 这是ComponentModule: @
我在 Angular 6 中使用 ng-bootstrap 模态时遇到问题。 首先,我有 2 个模块: AppModule 和 ComponentModule 这是ComponentModule: @
我制作了一个弹出组件,它可以动态加载内容组件,而不管类型如何。在 RC4 之后,如果不将组件添加到 entryComponents 列表中是不可能注入(inject)组件的。 是否可以加载组件而不在
当我创建一个新的页面组件时,我现在必须将它放在声明和 entryComponents 数组中。为什么它必须在两个地方? 例如,我刚刚创建了一个新的 login.page.ts 文件,但我必须在声明和
在将 ag-grid 与 angular4 一起使用时,我遇到了以下错误消息。 我试图在通过 HTTP 获取 json 后显示行数据。 this.gridOptions.api.setRowData(
我正在尝试关注 https://material.angular.io/components/component/dialog 上的文档但我不明白为什么会出现以下问题? 我在组件中添加了以下内容: @
我正在开发一个依赖于 angular 2 的 Ionic 应用程序 ( 2.0.0-rc0 )。所以引入了新的ngModules。我正在下面添加我的 app.module.ts.。 import {
谁能清楚地解释为什么在 IVY 编译器中,入口组件 API 不再需要了?换句话说,发生了什么变化内部 所以Angular突然不需要提醒你要动态创建组件 最佳答案 View 引擎 在 Ivy 之前, V
我是一名优秀的程序员,十分优秀!