父母对孩子:通过输入共享数据
这可能是最常见和最直接的数据共享方法。它通过使用 @Input() 装饰器来允许通过模板传递数据。
孩子到父母:通过 ViewChild 共享数据
ViewChild 允许将一个组件注入到另一个组件中,从而使父组件可以访问其属性和功能。然而,需要注意的一点是,在视图初始化之前,孩子将不可用。这意味着我们需要实现 AfterViewInit 生命周期钩子来接收来自孩子的数据。
子级到父级:通过 Output() 和 EventEmitter 共享数据
共享数据的另一种方法是从子级发出数据,父级可以列出这些数据。当您想要共享发生在按钮单击、表单整体和其他用户事件等事件上的数据更改时,这种方法是理想的选择。
在父级中,我们创建一个函数来接收消息并将其设置为等于消息变量。
在子进程中,我们使用 Output 装饰器声明了一个 messageEvent 变量,并将其设置为一个新的事件发射器。然后我们创建一个名为 sendMessage 的函数,该函数使用我们要发送的消息在此事件上调用 emit。最后,我们创建一个按钮来触发这个功能。
父组件现在可以订阅子组件输出的这个messageEvent,然后在这个事件发生时运行接收消息函数。
不相关的组件:与服务共享数据
在缺少直接连接的组件之间传递数据时,例如兄弟姐妹、孙辈等,您应该使用共享服务。当您拥有应该始终同步的数据时,我发现 RxJS BehaviorSubject 在这种情况下非常有用。
您也可以使用常规的 RxJS 主题通过服务共享数据,但这就是我更喜欢 BehaviorSubject 的原因。
它总是会在订阅时返回当前值 - 无需调用 onnext
它有一个 getValue() 函数来提取最后一个值作为原始数据。
它确保组件始终接收最新数据。
在服务中,我们创建一个私有的 BehaviorSubject 来保存消息的当前值。我们定义了一个 currentMessage 变量,将这个数据流作为一个 observable 来处理,供组件使用。最后,我们创建函数,调用 BehaviorSubject 上的 next 来更改其值。
父组件、子组件和兄弟组件都接受相同的处理。我们在构造函数中注入 DataService,然后订阅 currentMessage observable 并将其值设置为等于 message 变量。
现在,如果我们在其中任何一个组件中创建一个函数来更改消息的值。当这个函数被执行时,新数据会自动广播到所有其他组件。
参考:https://angularfirebase.com/lessons/sharing-data-between-angular-components-four-methods/