使用 apollo-angular,我有一个像这样的 apollo InMemoryCache
new InMemoryCache({
// ... stuff
cacheRedirects: {
Query: {
form: (_, args, { getCacheKey }) => {
console.log('cache key', [args, getCacheKey({ __typename: 'Form', id: args.formId })]);
return getCacheKey({ __typename: 'Form', id: args.formId });
},
},
},
});
当我运行此查询时,form
不会调用 cacheRedirect 函数。
this.apollo.watchQuery({
query: gql`
query FormSummary($formId: ID!) {
form(formId: $formId) {
__typename
id
description
}
}
`,
variables: { formId }
}).valueChanges
相反,查询只是(成功地)进入服务器,忽略了表单(带有__typename
、、id
和description
字段)已经在缓存中的事实。即使它不在缓存中,我希望仍会调用表单的 cacheRedirect 函数。当我进行这个极其相似的查询时,会调用表单的 cacheRedirect 。
this.apollo.watchQuery<any>({
query: gql`
query FormGet($formId: ID!) {
form(formId: $formId) {
...WholeFormResponse
}
}
${Fragments.wholeFormResponse}
`,
variables: { formId: id },
}).valueChanges
对于 cacheRedirects 的工作方式,我是否遗漏了一些明显的东西?我的印象query Form {}
是,只要调用以开头的查询,cacheRedirect for 就form
应该运行。
任何帮助是极大的赞赏!我想我错过了一些明显的东西......
注意:我对cacheRedirect的理解是fragment的内容WholeFormResponse
是无关紧要的,所以我没有包含它们。
更新
打开调试器并单步执行一些代码,我的 cacheRedirect 函数没有被调用(在错误示例中)的原因是因为typeof fieldValue
在 apollo InMemoryCache 源代码的这一行中 !== 'undefined'
。我还没有弄清楚为什么它应该是未定义的,或者为什么对于我的极其相似的工作查询它等于未定义。