我试图在最终版本2.0.0中动态加载组件。动态加载现有组件Angular 2最终版本
使用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最终版后,解析器不再存在,被编译器取代。
我发现了很多地方显示如何使用不同的代码加载它,但所有这些太复杂,我无法使它工作。
借此例如:How can I use/create dynamic template to compile dynamic Component with Angular 2.0?
它看起来更特定于该情况下,我的一个我只需要加载组件,并设置一个名为@input模型。
当我尝试时,我必须为每个组件动态创建一个模块,然后将组件添加到它。但后来我有问题说组件被设置在多个模块中,试图在某个地方删除一个不工作。
所示的代码的主要部分,我从这个链接获得: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,问题在于当您已经在不同的模块中声明了相同的组件时,angular将会使用comp躺下。在我的情况下,解决方案是导入我的ControlsModule,其中所有我的控件被导出。
我试图建立一个类似的事情。我有一个加载类和他们的讲座列表的JSON文件。这些课程被添加到导航栏中,讲座将作为详细视图中的列表添加。在点击讲座时,应该在详细视图中加载组件。对于每一个讲座,有不同的成分,我想创建一个模块或路由器链接,每个讲座(和路由器出口)的,而不是只加载喜欢你的例子组件。我仍然试图找出加载事物的最佳方式。的惊人解释 – Atieh