Angular:@Output()x:EventEmitter&之间的权衡是什么? @Input()回调?

时间:2018-03-05 21:43:18

标签: javascript angular typescript callback event-handling

@Output()x:EventEmitter&之间的权衡是什么? @Input()回调:功能?


作为寻找解决方案的第一步,我已经彻底阅读了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();
  • @Outputs是否自动为可选参数/属性?
  • @Outputs是否发出任何对Angular有帮助的信号?
  • 是否存在垃圾收集问题?
一般来说,这两种方法之间的权衡是什么?

1 个答案:

答案 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,则不应该担心内存泄漏。但是,您仍然有责任清理组件销毁的其他订阅。