我正在尝试在最终版本 2.0.0 中动态加载一个组件。
使用 RC5 我正在使用以下代码加载:
创建一个指令来加载控件:
import {
CheckboxComponent, CheckboxListComponent,DatePickerComponent
} from '../components/';
@Directive({
selector: '[ctrl-factory]'
})
export class ControlFactoryDirective implements OnChanges {
@Input() model: any;
constructor(private vcRef: ViewContainerRef, private resolver: ComponentResolver) {
}
create(cp) {
this.resolver.resolveComponent(cp)
.then(factory => {
const injector = ReflectiveInjector.fromResolvedProviders([], this.vcRef.parentInjector);
this.vcRef.createComponent(factory, 0, injector, []);
let ch = this.vcRef.createComponent(factory, 0, injector, []).instance;
ch.model = this.model;
});
}
ngOnChanges() {
if (!this.model) return;
switch (this.model.type) {
case 'checkbox':
this.create(CheckboxComponent);
break;
case 'checkboxlist':
this.create(CheckboxListComponent);
break;
case 'datepicker':
this.create(DatePickerComponent);
break;
default:
break;
}
}
}
然后在我的页面中加载该指令,如下所示:
<div ctrl-factory *ngFor="let child of page.childrens" [model]="child"></div>
但是从 rc5 更新到 2.0.0 最终版本后,解析器不再存在,被编译器取代。
我发现很多地方展示了如何使用不同的代码加载它,但所有这些都太复杂了,我无法让它工作。
以这个为例:如何使用/创建动态模板来编译带有 Angular 2.0 的动态组件?
它看起来更适合那个场景,我的那个我只需要加载组件并设置一个名为模型的@Input。
当我尝试时,我必须为每个组件动态创建一个module,然后将组件添加到其中。但是后来我遇到了一个问题,说该组件被设置在多个module中,尝试在某个地方删除但不起作用。
显示的代码的主要部分,我从这个链接得到:http : //blog.lacolaco.net/post/dynamic-component-creation-in-angular-2-rc-5/
并做了一些改变。
更新
我设法使其工作,使用以下方法:
创建方法已更改为
private create(cp) {
@NgModule({
imports: [BrowserModule, ControlsModule],
declarations: []
})
class DynamicModule {}
this.compiler.compileModuleAndAllComponentsAsync(DynamicModule)
.then(({componentFactories}) => {
const compFactory = componentFactories.find(x => x.componentType === cp);
const injector = ReflectiveInjector.fromResolvedProviders([], this.vcRef.parentInjector);
const cmpRef = this.vcRef.createComponent(compFactory, 0, injector, []);
cmpRef.instance.model = this.model;
});
}
我发现的大多数地方,设置创建组件并将其设置为 DynamicModule,问题是当您已经在不同的module中声明相同的组件时,angular 会抱怨。在我的情况下,解决方案是导入我的 ControlsModule,其中所有控件都被导出。