Skip to content

子组件获取父组件服务

假设如下场景

父组件是 ParentComp,绑定的服务是 ParentService。

父组件下依赖的子组件有 ChildComp1、ChildComp2、ChildComp3...,对应的服务有 ChildService1、ChildService2、ChildService3...

子组件获取父组件的服务

虽然子组件可以获取父组件的服务,但是如果在获取服务时,直接根据useService(ParentService)来获取父组件的服务,就会导致子组件是完全依赖着ParentService

准确的说是子组件的父组件必须绑定了ParentService,如果父组件没有绑定ParentService,那么子组件就获取不到ParentService,自然就会抛异常。

这就会导致子组件和父组件的耦合性过大,也就导致了子组件的复用性大大降低。为了实现一定程度的解耦,可以这么做。

在子组件中使用 token 来获取父组件的服务。

ts
const parentService = useService(parentServiceToken);

当然这里的 ParentServiceToken 有两种方案:

方案 1:

ts
const parentServiceToken = new Token<ParentService>('parent service token');

方案 1 的优点是简单方便,但是缺点是 parentServiceToken 和 ParentService 还是紧紧耦合在一起的。

方案 2:

ts
interface IParentService {
  property_need: string;
  method_need(): void;
}
const parentServiceToken = new Token<IParentService>('parent service token');

方案 2 的优点是 parentServiceToken 和 ParentService 已经完全解耦了,目前 parentServiceToken 的类型完全取决于 IParentService 这个类型定义。

父组件在绑定服务时,只需要确保 ParentService 实现了 IParentService 这个接口即可。

获取有其他的父组件也想要使用该子组件,只需要确保这个父组件的 OtherParentService 也实现了 IParentService 这个接口即可。