注意:为简单起见,将组件深度视为:
- Smart (grand)parent level 0
- dumb child level 1
....
- dumb grandchild level 2
....)
关于智能/大/父/子组件如何在多级(至少 3 个级别)链上进行通信和传递数据的方式有多种选择和条件。我们希望将我们的“智能”(祖)父组件保留为唯一可以访问我们的数据服务(或原子/不可变存储)的组件,它将推动与“哑”(孙)子级的信息交换。我们看到的选项是:
反模式(?):通过@Input/@Output 绑定在组件链上下传递数据。这就是一些人所说的“无关属性”或“自定义事件冒泡问题”(例如:这里和这里。)。不去。- 反模式:智能组件通过 @ViewChildren 或 @ContentChilden 访问哑(大)子级。这再次硬连线孩子,仍然没有为(大)孩子创建一个干净的机制来将数据向上传递给智能组件。
- 共享消息服务,如 angular.io 食谱中所述,这里是一篇优秀的文章。
- ?
现在在“3”的情况下,哑(大)子必须注入消息服务。这让我想到了我的问题:
Q1:对于每个“笨”(孙)子来说,注入消息服务在直觉上似乎很奇怪。消息服务的最佳实践是为这个家庭提供专用服务,还是搭载上面提到的“智能”祖父母负责的数据服务?
Q1A:此外,如果所有组件都将注入服务,这比在链上上下添加@Input/@Output 绑定要好得多吗?(我看到“愚蠢”组件需要某种方式来获取信息的论点)
Q2:如果“聪明”的祖父母正在与类似 redux 的商店(我们的 ngrx)进行通信怎么办?再一次,与“哑”组件的通信最好通过注入/专用消息服务进行,还是最好将存储注入每个“哑”组件......或者?请注意,组件间通信是“动作”(例如:表单验证、禁用按钮等)和数据(即,将数据添加到/更新存储或服务)的组合。
想法非常感谢!