【发布时间】:2017-10-05 15:59:09
【问题描述】:
我正在创建要加载到父组件中的模板组件,具体取决于我从服务器获得的响应。我会给你一个简短的例子,说明我正在尝试用伪代码做什么。
这是我的 html 父组件:
<div class="parent-container">
<div *ngIf="template1"> (load template1.component) </div>
<div *ngIf="template2"> (load template2.component) </div>
etc...
</div>
那么我将拥有不同的组件(为简洁起见,我只列出一个)
<div class="child-container">
<div> {{userName}} </div>
<div> {{contactNo}} </div>
<div> {{address}} </div>
</div>
在 ngInit 上,父级向服务器发出一个 http 请求并获取一个值。取决于父项中的值,我应该能够将子模板加载到父项中并显示它。因此,一旦加载,页面将如下所示:
<div class="parent-container">
<div class="child-container">
<div> {{userName}} </div>
<div> {{contactNo}} </div>
<div> {{address}} </div>
</div>
</div>
有角度的可能吗?我怎样才能创建它? 谢谢
[编辑]
我实现了dee zg的建议,代码如下:
@ViewChild(HostDirective) host: HostDirective;
OnNgInit(){}
//switch will be a response from a server
selector(switch){
switch(switch) {
case 'component1': {
this.loadComponent(Component1);
break;
}
default: {
break;
}
}
}
loadComponent(component){
var componentFactory = this._componentFactoryResolver.resolveComponentFactory(component);
var viewContainerRef = this.host;
this.viewContainerRef.clear();
var componentRef = this.viewContainerRef.createComponent(componentFactory);
(componentRef.instance);
}
这就是我的主机里面的东西
import { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[host]',
})
export class HostDirective {
constructor(public viewContainerRef: ViewContainerRef) { }
}
和 html
<ng-template host></ng-template>
有趣的是,如果 loadComponent 中的任何内容都将被加载到 OnInit 中,那么它将起作用。如果我从 loadComponent 调用它,我将得到该主机未定义。
【问题讨论】:
-
您知道哪些是您可以实际加载的组件吗?因为如果是这样,那么您当前的方法有效。这不是最优雅的方法,但它有效
-
是的,但我想要一个 if 语句,我将在其中加载后端告诉我的任何组件。父组件会根据响应选择使用哪个模板组件,然后将信息解析到 html 并渲染组件
-
编辑:查看 dee zg 答案。好的,有一种方法可以使用
ViewContainerRef和ComponentFactoryResolver在ng-template标签内动态加载组件,但是您仍然需要在父组件装饰器中“声明”您的动态组件,给我一些时间,我可以设置给你一个笨拙的人 -
是什么触发了您的
selector(switch)? -
基本上是来自服务器的响应。所以我向它发出一个http请求,如果我发现响应的属性为“Component1”,那么它将去切换,其余的也是如此。为简洁起见,我省略了所有其他内容,但一遍又一遍是同一件事
标签: angular