【发布时间】:2018-04-10 20:26:34
【问题描述】:
目前每个智能组件都有自己的 apollo.watchQuery, 这符合每个组件得到的正是它所要求的原则。
就像有 3 个地方在拉同一个实体,但每个组件都想要一些不同的东西。 而且我找不到为它创建服务的方法。
是否有为 graphql 实体创建服务的方法?
【问题讨论】:
标签: angular graphql apollo-client
目前每个智能组件都有自己的 apollo.watchQuery, 这符合每个组件得到的正是它所要求的原则。
就像有 3 个地方在拉同一个实体,但每个组件都想要一些不同的东西。 而且我找不到为它创建服务的方法。
是否有为 graphql 实体创建服务的方法?
【问题讨论】:
标签: angular graphql apollo-client
好问题!
因此,使用 GraphQL 管理客户端本地数据的全部意义在于将组件彼此分离,而获取 REST API 的常规 Angular 服务实际上是在创建耦合。
apollo-client 将负责自动完成共享工作。
因此,在您的示例中,这 3 个地方,即使它们不共享服务,apollo-client 也会对来自每个查询的数据进行规范化,这意味着它们共享相同的实体数据。
因此,如果一个查询更新了实体的数据,那么所有其他查询也应该得到更新,即使它们还没有运行。 如果不是这样,您应该检查一下您是否使用dataIdFromObject 配置好 apollo-client
但是apollo-client 这样做的同时仍然保持逻辑解耦,这意味着如果其中一个查询发生变化,它不会影响其他 2 个查询。
所以我认为你有两种结构选择:
apollo.watchQuery 放入一个 HOC(这在 React 世界中也很常见)。现在因为 Angular 的工作方式,有时感觉有点尴尬,因为 props 不像 React 那样在组件之间隐式传输。apollo.watchQuery 放入与组件绑定 的服务中,并放置在彼此相邻的文件夹中(并且可能具有相同的名称,例如-chat-view.component.ts 和chat-view.service.ts。 对于 Angular 开发人员来说,这可能看起来违反直觉,但我认为这是最好的方法。服务是组件的外部依赖项,但在这种情况下,您不想与其他组件共享它,因此您不会像使用 REST 创建的常规服务那样创建单点故障。
重要说明 - 即使您从服务器(或使用 Firebase 或任何其他协议..)查询 REST API,以上所有内容都适用于 apollo-client 2.0 和 apollo-angular 1.0。
您仍然可以在您的客户端应用程序上使用 Apollo 和 GraphQL 来获得所有这些好处,同时使用 apollo-link-rest 向您的服务器发送常规 REST 调用
【讨论】: