【发布时间】:2017-03-15 21:42:59
【问题描述】:
如何为 Angular 2 中动态创建的组件处理/提供 @Input 和 @Output 属性?
这个想法是在调用 createSub 方法时动态创建(在这种情况下)SubComponent。分叉很好,但我如何为 SubComponent 中的@Input 属性提供数据。另外,如何处理/订阅 SubComponent 提供的@Output 事件?
示例: (两个组件在同一个 NgModule 中)
应用组件
@Component({
selector: 'app-root'
})
export class AppComponent {
someData: 'asdfasf'
constructor(private resolver: ComponentFactoryResolver, private location: ViewContainerRef) { }
createSub() {
const factory = this.resolver.resolveComponentFactory(SubComponent);
const ref = this.location.createComponent(factory, this.location.length, this.location.parentInjector, []);
ref.changeDetectorRef.detectChanges();
return ref;
}
onClick() {
// do something
}
}
子组件
@Component({
selector: 'app-sub'
})
export class SubComponent {
@Input('data') someData: string;
@Output('onClick') onClick = new EventEmitter();
}
【问题讨论】:
-
过去你可以做这样的事情..
ref.instance.someData = someData。我不确定是否仍然如此。 -
这仍然有效。没有其他方法(除了使用共享服务进行通信)。 stackoverflow.com/questions/36325212/… 包含更多详细信息。
-
@KrisHollenbeck @Günter Zöchbauer 谢谢。所以每次父组件中的数据更改时,我必须将其设置为'ref.instance.someData = someData'并自行触发更改检测('ref.changeDetectorRef.detectChanges();')?以及如何找出子组件中的哪个属性是正确的?可以命名完全不同...:/也许直接使用
Reflection会尝试:) -
@thpnk,是的,我相信是的,听起来不错。自从后来的 RC 版本之一以来,我还没有尝试过这样做。我会参考 Gunter Zochbauer 的那篇文章以获取更多信息。 stackoverflow.com/questions/36325212/…
标签: javascript angular angular2-routing angular2-template