子组件获取父组件服务
假设如下场景
父组件是 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 这个接口即可。