注意:为了简单起见,考虑部件的深度为:角2 +/4/5:智能,哑和深深嵌套组件通信
- Smart (grand)parent level 0
- dumb child level 1
....
- dumb grandchild level 2
....)
有多种方案和条件如何智能/隆重/父/子组件在多层(至少3层)链上进行通信并传递数据。我们希望保留我们的'聪明'(大)父母组件作为唯一可以访问我们的数据服务(或原子/不可变的商店)的组件,它将促进与'愚蠢'(大)孩子交换信息。我们看到的选项是:
- 反模式(?):通过@ Input/@输出绑定将数据传递给组件链。这就是有些人称之为“无关属性”或“自定义事件冒泡问题”的问题(例如:here和here。)问题。不行。
- 反模式:智能组件通过@ViewChildren或@ContentChilden访问哑(大)孩子。这再次硬化了孩子们,并且仍然没有为(大)孩子们创建一个干净的机制来将数据传递给智能组件。
- 共享消息服务描述在angular.io食谱here和一个很好的帖子here。
- ?
现在在'3'的情况下,哑(大)孩子必须注入消息服务。这使我想到了我的问题:
问题1:对于每个'愚蠢'(大)孩子来说,注入消息服务似乎很奇怪。对于消息服务来说,最好的做法是为这个家庭提供一个专门的服务,还是在上面提到的'智能'祖父母的数据服务上捎带? Q1A:另外,如果所有组件都会注入一个服务,如何比添加@ Input/@ Output绑定更好? (我看到“愚蠢的”组件需要某种方式来获取信息的观点)
Q2:如果'聪明'祖父母正在与一个类似redux的商店(我们的ngrx)进行通信怎么办?最好通过注入/专用消息服务与“哑”组件进行通信,或者最好是将商店注入每个“哑”组件......或者,注意,除了数据(即将数据添加到/更新存储或服务)之外,组件间通信是“动作”(例如:表单验证,禁用按钮等)的组合。
非常感谢!
感谢您的想法。请注意,再次就解耦问题而言,海事组织除了提供间接服务是其主要职责之外,顶级部门不应该真正关心或了解其孙辈。顺便说一句,这与我原来的问题中的选项'2'没有太大差别。 – MoMo
不客气。我想我明白你的意思了 - 顶层父组件现在不仅需要知道子组件需要什么,而且还需要知道其确切的层次结构。我个人对此表示赞同,因为我将这种协调视为父组件的工作。或者我创建一个服务将JSON转换为包含表示数据/回调(适用于单元测试)的分层视图模型。你是对的,这有点像你的第二选择,但没有真正触摸视图的孩子。无论如何,我很好奇你怎么最终解决这个问题。祝你好运! –