通过ComponentFactoryResolver创建组件时更改检测不起作用

时间:2017-03-30 08:42:31

标签: angular input components angular2-directives

我有一个组件,使用ComponentFactoryResolver创建另一个组件。它似乎工作正常,我可以通过@Input访问数据。问题是当组件启动或数据更改时,永远不会调用ngOnChanges。但是,如果我使用HTML中的选择器以正常方式创建组件,它会触发。虽然这不是动态的,所以我留下了ComponentFactoryResolver。这是正常行为吗?

我的父组件有它的输入:

@ViewChild(MyDirective)myHost:MyDirective;

然后它创建子组件,其输入如下:

@Input('key') key: String;
@Input('index') index: number;

我正在创建这样的组件:

let item = new Item(ItemDropdownComponent, this.key, 0);
let componentFactory = this._componentFactoryResolver.resolveComponentFactory(item.component);
let viewContainerRef = this.myHost.viewContainerRef;
viewContainerRef.clear();
let componentRef = viewContainerRef.createComponent(componentFactory);
(<ItemInterfaceComponent>componentRef.instance).key = item.key;
(<ItemInterfaceComponent>componentRef.instance).index = item.index;

2 个答案:

答案 0 :(得分:2)

这预期的行为。 您可以通过

明确地调用更改检测
componentRef.changeDetectorRef.detectChanges();

答案 1 :(得分:0)

如果您手动运行更改检测,请注意它将为组件及其所有子组件运行,表示完整分支。 所以你需要考虑在创建新孩子时分离其他孩子。

跟踪此问题: https://github.com/angular/angular/issues/22010