динамически изменить функцию поиска - PullRequest
0 голосов
/ 06 мая 2019

контекст: я пытаюсь реализовать привязку нескольких индексов только к одному полю поиска

У меня есть массив индексов, и я хочу отредактировать searchFunction первого.

const indexes = indexNames.map( name => return createAlgoliaIndex(name) )
const main = indexes[0]

main.searchFunction = (helper) => {
  indexes.forEach( (algoliaIndex, index) => {
    if (index === 0)
      return;

    algoliaIndex.helper.setQuery(helper.state.query).search()
  })

  helper.search()
}

createAlgoliaIndexFor(name) {
  return instantsearch({
    indexName: name,
    searchClient
  })
}

В основном это не работает: (

есть идеи?

1 Ответ

1 голос
/ 07 мая 2019

У вас явно нет выбора: опция searchFunction должна быть передана во время инициализации.

Вот рабочий пример (извините, код немного грязный):

const searchClient = algoliasearch('1KCCSVLJHD', '0fb99058412c4776c60725c0fe9b2d7d');

const indexes = ["test", "test2"].map((name, idx) => {
  const searchFunction = idx !== 0 ? null : (helper) => {
    indexes.forEach((algoliaIndex, index) => {
      if (index === 0) {
        return;
      }

      algoliaIndex.helper.setQuery(helper.state.query).search()
    });

    helper.search();
  };

  return instantsearch({
    indexName: name,
    searchFunction,
    searchClient
  })
});


indexes[0].addWidget(instantsearch.widgets.searchBox({
  container: '.search-box'
}));
indexes[0].addWidget(instantsearch.widgets.hits({
  container: '.hits-1'
}));
indexes[1].addWidget(instantsearch.widgets.hits({
  container: '.hits-2'
}));


for (var i = indexes.length - 1; i >= 0; i--) {
  indexes[i].start();
}
<script src="https://cdn.jsdelivr.net/npm/algoliasearch@3.32.1/dist/algoliasearchLite.js"></script>
<script src="https://cdn.jsdelivr.net/npm/instantsearch.js@3.2.0"></script>
<div class="search-box"></div>

<h1>First index</h1>
<div class="hits-1"></div>

<h1>Second index</h1>
<div class="hits-2"></div>

Это в основном то, что вы делаете, но searchFunction передается непосредственно в функцию инициализации instantsearch, только для первого (основного) индекса.

Обратите внимание, что поскольку вызов start для экземпляра InstantSearch немедленно вызовет search и, следовательно, searchFunction, вы должны запустить главный экземпляр последним, чтобы helper существовал в других экземплярах.

...