Как исправить, что атрибут ‹attribute› не является полученным аспектом в слайдере React-InstantSearch ConnectedRange в Algolia?

Я использую ползунок диапазона с react-instantsearch и пытаюсь управлять реквизитом attributeName с помощью переменной в состоянии моего компонента.

Ползунок (код которого ниже) вызывается из родительского компонента так:

<InstantSearch
    appId='etc'
    apiKey='etc etc'
    indexName='etc'
 >
    <InstantSearchSlider
        updatePriceAttributeName={this.props.updatePriceAttributeName}
        min={this.props.min}
        max={this.props.max}
        attributeName={this.state.currentAttributeName}
     />
</InstantSearch>

Однако, когда я меняю значение currentAttributeName в state, я встречаюсь с этой ошибкой:

Uncaught Error: prices.hourly.ten is not a retrieved facet.
    at SearchResults../node_modules/algoliasearch-helper/src/SearchResults/index.js.SearchResults.getFacetValues (index.js:640)
    at ProxyComponent.getProvidedProps (connectRange.js:119)
    at ProxyComponent.getProvidedProps (createConnector.js:259)
    at ProxyComponent.componentWillReceiveProps (createConnector.js:168)
    at ProxyComponent.componentWillReceiveProps (createPrototypeProxy.js:44)
    at ReactCompositeComponent.js:610
    at measureLifeCyclePerf (ReactCompositeComponent.js:75)
    at ReactCompositeComponentWrapper.updateComponent (ReactCompositeComponent.js:609)
    at ReactCompositeComponentWrapper.receiveComponent (ReactCompositeComponent.js:546)
    at Object.receiveComponent (ReactReconciler.js:124)

Я хочу, чтобы мои пользователи выбирали один атрибут из списка возможных атрибутов. Есть ли способ сделать это?

// InstantSearchSlider.js
// nearly a full copy/paste from algolia docs, but with a different slider component

class Range extends Component<Props, State> {
    static defaultProps = {
        refine: minMax => minMax
    };
    state = { currentValues: { min: this.props.min, max: this.props.max } };

    componentWillReceiveProps(sliderState) {
      if (sliderState.canRefine) {
        this.setState({
            currentValues: {
                min: sliderState.currentRefinement.min,
                max: sliderState.currentRefinement.max
            }
        });
        }
    }

    onValuesUpdated = sliderState => {
        this.setState({
            currentValues: {
                min: sliderState[0],
                max: sliderState[1]
            }
        });
    };

    onChange = sliderState => {
        console.log(sliderState);
        if (
            this.props.currentRefinement.min !== sliderState[0] ||
            this.props.currentRefinement.max !== sliderState[1]
        ) {
            this.props.refine({
                min: sliderState[0],
                max: sliderState[1]
            });
        }
    };

    render() {
        const { min, max, currentRefinement } = this.props;
        const { currentValues } = this.state;
        return min !== max
            ? <div>
                  <PackageSelector handleUpdate={this.props.updatePriceAttributeName} />
                  <Slider
                      range
                      defaultValue={[min, max]}
                      min={min}
                      max={max}
                      value={[currentRefinement.min, currentRefinement.max]}
                      onChange={this.onChange}
                      onAfterChange={this.onValuesUpdated}
                  />
                  {/* <Rheostat
                      min={min}
                      max={max}
                      values={[currentRefinement.min, currentRefinement.max]}
                      onChange={this.onChange}
                      onValuesUpdated={this.onValuesUpdated}
                  /> */}
                  <div
                      style={{
                          display: 'flex',
                          justifyContent: 'space-between'
                      }}
                  >
                      <div>
                          {currentValues.min}
                      </div>
                      <div>
                          {currentValues.max}
                      </div>
                  </div>
              </div>
            : null;
    }
}

export default connectRange(Range);

ETA: эта ошибка также возникает, когда я пытаюсь скрыть виджеты мгновенного поиска при первоначальном рендеринге, открывая их после взаимодействия с пользователем (например, в сворачиваемом div). Я предполагаю, что это означает, что проблема не связана напрямую с состоянием, но я еще недостаточно уверен в том, что это такое, чтобы обновить заголовок.


person Brandon    schedule 23.10.2017    source источник
comment
Привет, Брэндон, я пытался воспроизвести твою проблему, но безуспешно. Не могли бы вы обновить этот код и поле своим кодом, чтобы показать проблему? codesandbox.io/s/p5704rpjpj   -  person Marie    schedule 23.10.2017
comment
можете ли вы console.log updatePriceAttributeName, min, max, attributeName когда видите ошибку.   -  person Abhinav Jain    schedule 23.10.2017
comment
@Мари, спасибо, что попросила меня сделать это. Пытаясь воспроизвести это, я понял, что эта проблема возникает только в моем индексе, а не в индексе bestbuy из учебника. Я обновлю, как только выясню точную причину.   -  person Brandon    schedule 23.10.2017
comment
@ Брэндон, можете ли вы проверить, что prices.hourly.ten присутствует в качестве атрибутаForFacetting на вашей панели инструментов?   -  person Marie    schedule 23.10.2017
comment
Может быть, этот атрибут присутствует не во всех записях @AbhinavJain?   -  person Haroen Viaene    schedule 23.10.2017
comment
@Marie Я, кажется, понял это - объяснил это в своем ответе, но tl; dr в том, что атрибуты, отсутствующие в attributesForFaceting, были проблемой, но мне также пришлось удалить жестко запрограммированный min/ max из компонента ползунка после того, как я добавил атрибуты в список.   -  person Brandon    schedule 24.10.2017


Ответы (1)


Спасибо Мари из Алголии за помощь мне здесь.

Ошибка была результатом каскадной серии проблем.

Атрибуты, которые я пытался установить для RangeSlider, не были указаны в attributesForFaceting в тире. Я добавил их, но это не сразу решило проблему.

До их добавления ползунок работал, но он не вычислял минимальные/максимальные значения автоматически (и ошибок не возникало), поэтому я просто жестко запрограммировал минимальные/максимальные значения.

Тем не менее, похоже, что жестко запрограммированные минимальные/максимальные значения ломают ползунок, когда я пытался поменять местами attributeNames, независимо от того, были ли значения в attributesForFaceting.

Итак, я удалил жестко закодированные минимальные/максимальные значения, и, поскольку я добавил атрибуты к attributesForFaceting, минимальное/максимальное значение было рассчитано правильно, и я смог нормально переключаться между атрибутами.

person Brandon    schedule 24.10.2017