Apollo Angular 中的直接缓存访问

Posted

技术标签:

【中文标题】Apollo Angular 中的直接缓存访问【英文标题】:Direct Cache Access in Apollo Angular 【发布时间】:2017-12-08 10:06:48 【问题描述】:

我有以下服务等级:

const DeleteUserMutation = gql `
	mutation($user_id: ID!) 
		deleteUser(id: $user_id) 
			id
		
	
`;

@Injectable()
export class UserService 
  constructor(private apollo: Apollo) 

  deleteUser(userId: string) 
    return this.apollo.mutate(
      mutation: DeleteUserMutation,
      variables: 
        user_id: userId
      ,
      update: (proxy, mutationResult) => 
        proxy.writeQuery(
          query: DeleteUserMutation,
          data: 
            deleteUser: 
              id: userId,
              __typename: 'User'
            
          ,
          variables: 
            user_id: userId
          
        );
      ,
    )
  

我试图从我的服务器中删除一个用户。突变实际上在服务器上成功运行并执行,但缓存永远不会更新。我不确定上面的update 部分哪里出了问题。

【问题讨论】:

【参考方案1】:

当此用户存在时,您尝试更新 Mutation 而不是 Query

假设您有以下查询:

query allUsers 
  users: [User]

要更新缓存,您需要执行以下操作:

const DeleteUserMutation = gql `
    mutation($user_id: ID!) 
        deleteUser(id: $user_id) 
            id
        
    
`;

@Injectable()
export class UserService 
  constructor(private apollo: Apollo) 

  deleteUser(userId: string) 
    return this.apollo.mutate(
      mutation: DeleteUserMutation,
      variables: 
        user_id: userId
      ,
      update: (proxy,  data:  deleteUser  ) => 
        // Get data from `allUsers` query
        const data = proxy.readQuery(
          query: AllUsersQuery
        );

        // Logic to remove an item from an array
        const users = removeUserFromArray(deleteUser.id, data.users);

        // write new array with users to the store
        proxy.writeQuery(
          query: AllUsersQuery,
          data: 
            users
          
        );
      ,
    )
  

查看"Updating the Store" 章节,react-angular 文档中带有update() 函数的部分。这些规则也适用于 Angular。

【讨论】:

谢谢,我试试这个。但是,即使 allUsers 查询不是导致该用户列表首先出现在商店中的原始查询,这是否有效? 所以我试过了,答案是否定的……我想我需要的可以通过writeFragment解决呢?

以上是关于Apollo Angular 中的直接缓存访问的主要内容,如果未能解决你的问题,请参考以下文章

watchQuery (Angular-Apollo) 的缓存管理

订阅 Angular Apollo 查询 observable 会带来旧值、缓存问题

Apollo Angular 客户端总是使用缓存

在 Angular Apollo Graphql 中访问突变结果

Apollo-boost 缓存问题

apollo-link-state 以及如何访问本地状态/缓存?