gpt4 book ai didi

angular - 在不破坏 AoT 的情况下动态加载组件 - Angular2

转载 作者:太空狗 更新时间:2023-10-29 17:57:22 27 4
gpt4 key购买 nike

所以我试图创建一个模块,它会接受一堆组件并动态加载它们,但不会弄乱 AoT。这已被证明是一个挑战,但除了一件事,我已经非常接近了。如何检索存储在 ComponentFactory 中的所有组件?

在 mij app.module.ts 中,我将组件数组传递给动态加载模块的 forRoot():

imports: [
DynamicLoadModule.forRoot(dynamicComponents),
]

在我的 dynamic-load.module.ts 中,我将它们全部添加到 Angular2 ComponentFactory:

static forRoot(components: any[]) {
return {
ngModule: DynamicLoadModule,
providers: [{
provide: ANALYZE_FOR_ENTRY_COMPONENTS,
useValue: components,
multi: true,
}, {
provide: DynamicLoadService,
useValue: new DynamicLoadService(components)
}]
};
}

现在问题出在 DynamicLoadService 上,它干扰了 AoT。我已经尝试了记录的导出函数方式,但这并没有解决问题,因为这样我无法将 components 作为参数传递给服务。所以在the Angular documentation中找到了以下内容没有为我的问题提供解决方案:

let heroServiceFactory = (logger: Logger, userService: UserService) => {
return new HeroService(logger, userService.user.isAuthorized);
};

export let heroServiceProvider =
{ provide: HeroService,
useFactory: heroServiceFactory,
deps: [Logger, UserService]
};

然后我尝试通过使用 OpaqueToken 将组件传递到我的 dynamic-load.module,这也没有帮助,因为我当时有未编译的组件最好,我的模块失去了很多灵 active 。

所以我得出结论,如果我需要 ComponentFactory 中所有组件的数组,我只需要一种方法来检索它们。
因此,我现在使用 ComponentFactoryResolver 根据名称获取一个模板,我需要获取所有模板,或者至少获取工厂中组件的所有名称。

if (selectedComponent !== '') {
if (typeof this.currentComponent !== 'undefined') { this.currentComponent.destroy(); }

const components = this.dynamicLoadService.getComponents(), // --> instead of getting a list of available components through this service which needs the factory that blocks AoT, I should just be able to retrieve all available components from the ComponentFactory
component: any = components.find((x) => x.name.toLowerCase().indexOf(selectedComponent) > -1),
compFactory = this.cfr.resolveComponentFactory(component);

this.currentComponent = this.vcr.createComponent(compFactory);
this.currentComponent.instance.data = this.componentData;
}

最佳答案

编辑所以第一个答案并没有完全解决问题,但另一个乐于助人的人能够通过 Angular Github 帮助我解决问题。 .

最后我的代码如下所示:

import { NgModule, ANALYZE_FOR_ENTRY_COMPONENTS, Inject } from '@angular/core';
import { DynamicLoadService } from './dynamic-load.service';

import { DynamicLoadComponent } from './dynamic-load.component';

export function DynamicLoadFactory(cmps) {
return new DynamicLoadService(cmps);
}

@NgModule({
declarations: [
DynamicLoadComponent
],
exports: [
DynamicLoadComponent
]
})
export class DynamicLoadModule {
static forRoot(components: any[]) {
return {
ngModule: DynamicLoadModule,
providers: [{
provide: ANALYZE_FOR_ENTRY_COMPONENTS,
useValue: components,
multi: true
},
{
provide: 'ENTRIES',
useValue: components
},
{
provide: DynamicLoadService,
useFactory: DynamicLoadFactory,
deps: [[new Inject('ENTRIES')]]
}]
};
}
}

正如我所指出的,ANALYZE_FOR_ENTRY_COMPONENTS 不是依赖注入(inject)树的一部分(查找来源 here)。所以上面的解决方法解决了这个问题。


所以答案是在 Angular Github 上成为一个非常乐于助人的人。

有人建议我应该

Just inject ANALYZE_FOR_ENTRY_COMPONENTS into DynamicLoadService

现在看起来像这样:

export function DynamicLoadFactory(cmps) {
return new DynamicLoadService(cmps);
}

export class DynamicLoadModule {
static forRoot(components: any[]) {
return {
ngModule: DynamicLoadModule,
providers: [{
provide: ANALYZE_FOR_ENTRY_COMPONENTS,
useValue: components,
multi: true,
}, {
provide: DynamicLoadService,
useFactory: DynamicLoadFactory,
deps: [new Inject(ANALYZE_FOR_ENTRY_COMPONENTS)]
}]
};
}
}

source at Github

关于angular - 在不破坏 AoT 的情况下动态加载组件 - Angular2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42482917/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com