虽然可能不是最优雅的解决方案,但我使用DynamicComponentLoader和ElementRef为组件动态分配模板值.事实上,我一直在寻找一种解决方案,可以在占位符中添加多个自定义组件.
我try 了shmck概述的函数中的服务注入,这不起作用,因为调用模板函数时服务还不可用.实际上,this
指的是窗口对象.
我使用的解决方案的参考URL位于:create dynamic anchorName/Components with ComponentResolver and ngFor in Angular2
我也是这样参考Plnkr1和Plnkr2的.
site Dartdocs提供了Angular 2 DynamicComponentLoader类的优秀文档,也适用于TypeScript.
简而言之:
一个简单的组件作为要使用的模板
@Component({
selector: 'dt2-simple-block',
properties: ["idx"],
template: `<h1>Simple block for {{ idx }} </h1>`,
directives: []
})
class dt2SimpleBlock {
constructor() {
}
}
包含要添加的所有组件的组件的构造函数(我的应用程序需要包含多个Child:
constructor(loader: DynamicComponentLoader, elementRef: ElementRef) {
//iterate
for (var i = 0; i < toSomething; i++) {
// build the template
var blockdirective = 'dt2-simple-block'
var template = '<' + blockdirective +
' idx="' + this.userBlocks.userHomePanelBlocks[i] +
'"></' + blockdirective + '>';
console.log(template); // debugging purpose
var directives = [dt2SimpleBlock];
loader.loadNextToLocation(toComponent(template, directives), elementRef);
}
以及要放在某个位置作为实用程序的帮助器函数
function toComponent(template, directives = []) {
@Component({ selector: 'fake-component' })
@View({ template, directives })
class FakeComponent { }
return FakeComponent;
}