RT
一、需求
- 白色区域为公共组件A;
- 红色区域为公共组件B,有色绿色区域为多个功能按钮(如年、月、日)
- 黑色区域为组件C(可以看做是一个页面)
- 组件C用于想服务端拉取数据,再向组件B传递,并且在页面中复用组件B(多次)
- 组件A用于展示数据
- 组件B中的绿色按钮部分用于触发重新拉取数据
二、我的解决方案
- 使用@Input和@Output逐层通信,C拉取数据传递给A,B触发点击事件后通过
EventEmitter
传递给A,在A中再通过EventEmitter
传递给C,C接收后再向服务端拉取数据,再把获取的数据传递给A,用作展示 - 新建一个
service
,在service
中定义一个subject
,再定义两个方法sendMsg
和getMsg
用于发布订阅,在C中注入service
,调用getMsg
方法用于订阅消息,在A中注入service
,调用sendMsg
方法用于发布消息
三、思考
- 第一种解决方案,个人觉得这样不够友好,且传递次数过多,而且写法也比较low
- 第二种解决方案,使用
rxjs
,感觉高大上了很多,但不易阅读。并且当在C组件多次复用A的时候,依然要使用第一种解决方案去向每一个复用的A组件传递一个唯一标识name
,然后A再将name
传递给B,当B触发点击事件的时候再把这个唯一标识name
传递回C,用于确定再次获取数据后给哪个被复用的A更新数据。这样就很绕
四、问题
- 有没有其他解决方案?
- 如果没有,在原有的解决方案中如何能更优雅?
既然已经写成组件了,angular 就只有@input和@output来传递信息了。