作为寻找解决方案的第一步,我已经彻底阅读了Angular2 why use @Output over @Input for callbacks。标题似乎也提出了同样的问题,但是接受标准中的问题相当浅,我的问题是寻找更多细节。请参阅下面的详细信息。
至少有3种方法可以在Angular ++中完成Child-to-Parent通信(不是1.x),但是为了更好地实现第3种选择,我只关心其中的2个问题:
使用EventEmitter
作为@Output
@Output() onEvent: EventEmitter<any> = EventEmitter<any>();
使用回调作为@Input
@Input() handleEvent: Function = new Function();
答案 0 :(得分:2)
@Outputs
是数据流。它们基本上是Observables
,还有一些额外的爵士乐。 Angular并不(立即)关注所发出的数据。 Angular将在内部使用Output
挂钩来运行更改检测,主要用作子到父通信挂钩。
@Inputs
是属性绑定。 Angular通过输入来管理变更检测,其行为可以通过ChangeDetectionStrategy
进行更改。在组件的生命周期挂钩开始触发之前,组件也必须解析@Inputs
。 @Inputs
主要用作父母与子女之间的沟通。
将事件处理程序设置为@Input
不被视为良好做法,并且违反了Angular样式指南。 Angular已在@Input
属性上运行更改检测,并在属性值更改时比较 。将输入设置为函数(并将属性绑定到函数)可能导致更改检测不可预测。相反,在getters
上使用setters
和@Inputs
或使用ngOnChanges
挂钩来执行属性绑定更改的逻辑。
还有一些用例可以将@Output
和@Input
组合到一个属性中(例如像[(ngModel)] )
这样的香蕉盒式语法。
如果您按照文档和建议使用Angular的API,则不应该担心内存泄漏。但是,您仍然有责任清理组件销毁的其他订阅。