【发布时间】:2018-06-11 01:32:35
【问题描述】:
我正在使用 Angular 6,我已经尝试按照答案 here 进行操作,但我无法让它工作
export class AppComponent implements AfterContentInit, AfterViewInit {
defaultToTrue = true;
@ViewChildren('parent', { read: ViewContainerRef }) parent: QueryList<ViewContainerRef>;
constructor(private cfr: ComponentFactoryResolver) { }
ngAfterViewInit(){
const resolve = this.cfr.resolveComponentFactory(ChildComponent);
this.parent.changes.subscribe(changes => {
this.parent.createComponent(resolve); //Error
});
}
}
HTML:
<div *ngIf="defaultToTrue">
<div #parent></div>
</div>
【问题讨论】:
-
@yurzui 谢谢,但问题是我收到“检查错误后表达式已更改”。但是我在 stackblitz 上没有看到这个。
-
好的,我删除了我的答案,因为它是错误的。您必须自己确定您的应用是否曾进入 AfterViewInit。但请记住我在下面所说的:在您的订阅中,
parent仍然是QueryList<ViewContainerRef>类型的列表。这个列表没有与普通 ViewContainerRef 相同的方法。你不能在这里使用this.parent.createComponent(resolve);。尽管我对解决方案的建议没有奏效,但这仍然是正确的。 -
@yurzui 的建议有效吗(尽管有例外)?
-
所以你只需要摆脱异常?这两种技术之一可能会有所帮助:(1)在
createComponent之后调用ChangeDetectorRef.detectChanges(); (2) 与setTimeout(() => { this.parent.createComponent(resolve); })异步调用createComponent。
标签: angular