【问题标题】:How to search within nested objects如何在嵌套对象中搜索
【发布时间】:2019-07-19 13:02:13
【问题描述】:

我已经完成了我的研究,试图弄清楚如何实现我在下面描述的内容,但是我没有运气。

在我的 Algolia 索引中,一些记录具有嵌套对象。 例如,titlesubtitle 属性的格式如下:

title:
{ 
   "en": "English title", 
   "gr": "Greek title" 
} 

我只想对这些属性的特定子集(在我们的示例中为“en”或“gr”)执行查询,而不在 UI 中“公开”任何方面——理想情况下,语言选择将基于“自动”完成在使用 props 传递给 Vue 组件的变量 (lang) 上。我正在使用具有默认 Vue 实现的 Laravel Scout 包,如文档 here 中所述。

我的 InstantSearch 实现非常简单,我没有定义任何关于查询和可搜索属性的具体内容,我目前正在使用 Algolia 的所有默认功能。

<template>
    <ais-instant-search
            :search-client="searchClient"
            index-name="posts_index"
    >
        <div class="search-box">
            <ais-search-box placeholder="Search posts..."></ais-search-box>
        </div>
        <ais-hits>
            <template
                slot="item"
                slot-scope="{ item }"
            >
                <div class="list-image">
                    <img :src="'/images/' + item.image" />
                </div>
                <div class="list-text">
                    <h2">
                         {{ item.title }}
                    </h2>
                    <h3>
                        {{ item.subtitle }}
                    </h3>
                </div>

            </template>
        </ais-hits>
    </ais-instant-search>
</template>

<script>
    import algoliasearch from 'algoliasearch/lite';

    export default {
        data() {
            return {
                searchClient: algoliasearch(
                    process.env.ALGOLIA_APP_ID,
                    process.env.ALGOLIA_SEARCH
                ),
                route: route,
            };
        },
        props: ['lang'],
        computed: {
            computedItem() {
                // computed_item = this.item;
            }
        }
    };
</script>

当变量lang 设置为“en”时,我想以某种方式传递一个选项来查询“title.en”和“subtitle.en”。所有这一切,用户无需在 UI 中选择“title.en”或“subtitle.en”。

更新

也许计算属性 是要走的路,但是我找不到如何在计算属性中引用搜索结果/点击属性(例如item.title)。这是我注释掉的代码。

【问题讨论】:

  • 变量 language 来自哪里?你说的是 cookie,但我在代码中看不到它
  • @onuriltan 我刚刚编辑了我的原始帖子以包含 lang 变量,作为道具传递给 vue 组件。
  • 您可以查看答案吗?如果不能解决问题,我可以帮忙

标签: vue.js algolia


【解决方案1】:

我认为,您可以使用计算属性。只需根据当前语言变量转换当前项即可。

new Vue({
  template: "<div>{{ computedItem.title }}</div>",
  data: {
    langFromCookie: "en",
    item: {
      title: {
        en: "Hello",
        ru: "Привет"
      }
    }
  },
  computed: {
    computedItem() {
      const item = JSON.parse(JSON.stringify(this.item));

      for (value in item) {
        if (typeof item[value] === "object" && Object.keys(item[value]).includes(this.langFromCookie))
          item[value] = item[value][this.langFromCookie];
      }

      return item;
    }
  }
}).$mount("#app")
<div id="app"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

【讨论】:

  • 我喜欢这种方法,但是您的解决方案仅转换搜索后显示的记录(结果),而不是修改搜索查询以限制结果?我猜对了吗?
【解决方案2】:

如果 lang 变量可以通过 props 获得,您可以在 list-text class 中检查它并通过传递动态 lang 相应地返回 {{title.en}} 或 {{title.gr}}值 title[lang] 如下所示

...

<div class="list-text">
   <h2>
      {{ item.title[lang] }}
   </h2>
   <h3>
      {{ item.subtitle[lang] }}
   </h3>
</div>

如果你想在组件挂载时根据 lang prop 发出请求,那么你可以在mounted()方法中发出请求,然后像下面这样查询

mounted() {
  axios.get(`/getSomethingWithLang/:${this.item.title[this.lang]}`)
  ... 
}

【讨论】:

  • 恐怕这只会影响结果(例如 item.title)的显示方式,而不是查询方式。我要查询item.title[lang],不只显示item.title[lang]
  • 你想什么时候查询? lang prop 改变后?查询你的意思是对某个端点的 api 请求?
  • lang 属性没有改变,但是我想在“title.en”中查询(或“搜索”),例如,当 lang 为“en”时。不只是显示“title.en”。我认为我必须找到一种方法来引用计算属性中的“项目”,因为 data() 中没有“项目”。
  • 所以你想在组件挂载上做它,如果 lang 是“en”那么你想查询,如果 lang 是“gr”,那么你也想查询,但是使用不同的 lang 参数据我了解
  • 我不想提出额外的请求或修改 Algolia 的 InstantSearch “自动”工作的方式。我已经包含了 InstantSearch 的 Vue 组件,它负责搜索/查询功能,我想知道是否有办法稍微修改一下,以便包含“lang”属性,而不是实现整个查询。 . 非常感谢您的努力。
猜你喜欢
  • 2020-06-15
  • 2021-03-23
  • 2011-12-29
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多