保持理智过滤

问题描述 投票:0回答:1

为了向架构添加语言并进行本地化,我使用“@sanity/document-internationalization”中的 documentInternationalization。 当我在父模式中使用另一个模式时,我想进行过滤,但我不知道如何进行过滤。

defineField({  name: 'product',
  type: 'array',
  of: [{type: 'reference', to: [{type: 'dogTreat'}, {type: 'catTreat'}]}],
  options: {
    filter: ({ document }) => {
    let currentLanguage = document.language; 
    return {
      filter: `_type == "catTreat" && slug.current == '${currentLanguage}' `,
      params: {
        type:'catTreat'},
      }
    }
  },
  group: 'products',
}),

如果当前页面是 en-US,我想在下拉菜单中查看产品的 en-US 版本。我已为这两种模式提供了语言,但无法对其进行过滤。有人可以帮忙吗?

sanity
1个回答
1
投票

看来是您的过滤器有问题。需要注意的一些事项:

  1. 选项位置错误 |目前您的选项正在应用于阵列。它们应该嵌套在您的引用类型中,否则它没有任何功能。

  2. 多重_type限制 |一般来说,我只建议在一个位置过滤类型。在您的数组引用中,您允许用户选择dogTreat 和catTreat。然后,在您的过滤器中,您将其专门限制为 catTreat。如果可能的话,我会从过滤器中删除 _type 并仅在引用类型中执行此操作。

  3. 错误地将参数传递给过滤器 |您可以使用 let currentLanguage = document.language 正确获取文档的语言,但随后错误地将其传递给过滤器。您不应该使用字符串插值来传递变量,而应该使用 params 对象(就像您用于“type”属性一样)。然后您引用该变量的方式也会更改为如下所示: return {filter: 'slug.当前 == $language',参数:{语言:currentLanguage}}。

  4. 过滤错误值 |我还刚刚根据文档语言设置了引用过滤,然后您可以通过过滤文档的语言属性(而不是 slug.current)来完成此操作。

您的字段应如下所示:

      defineField({
      title: 'Products',
      name: 'product',
      type: 'array',
      of: [
        defineArrayMember({
          type: 'reference',
          to: { type: 'catTreat' },
          options: {
            filter: ({ document }) => {
              const { language } = document
    
              if (language) {
                return {
                  filter: 'language == $language',
                  params: {
                    language: language,
                  },
                }
              }
    
              return {}
            },
          },
        }),
      ],
      group: 'products',
    })
© www.soinside.com 2019 - 2024. All rights reserved.