Skip to content
This repository has been archived by the owner on Sep 5, 2024. It is now read-only.

ais-range-slider does not works under *ngIf #804

Open
Celtian opened this issue Feb 11, 2021 · 5 comments
Open

ais-range-slider does not works under *ngIf #804

Celtian opened this issue Feb 11, 2021 · 5 comments

Comments

@Celtian
Copy link

Celtian commented Feb 11, 2021

Describe the bug 🐛

Range slider cannot be hidden by *ngIf. I can use display none in some cases. However If i use third-party lib like ngBootstrap with ngAccordion, it does not works because it is using *ngIf internally because it prevents to render large scaled DOM.

To Reproduce 🔍

Steps to reproduce the behavior:

 <ais-range-slider
   *ngIf="someDynamicCondition"
   attribute="listings.price"
   [precision]="0">
</ais-range-slider>

Expected behavior 💭

NgIf can be use like for the other types of filters in your library.

Screenshots 🖥

Console log that shows you the problem:
image

Environment:

  • OS: windows
  • Browser chrome
  • algoliasearch: 3
  • angular-instantsearch: 3.0.0-beta.5
  • instantsearch.js: 3
  • @angular/core: 11.1.0
  • @ng-bootstrap/ng-bootstrap: 9.0.1
  • bootstrap: 4.6.0
@Haroenv
Copy link
Contributor

Haroenv commented Feb 11, 2021

could you conditionally show & hide a wrapping container of the slider? Note that when you not render the component, the refinement will likely disappear

@Celtian
Copy link
Author

Celtian commented Feb 11, 2021

Hello @Haroenv ,

it is not working.

see https://ng-bootstrap.github.io/#/components/accordion

<ais-instantsearch [config]="config">
  <ngb-accordion [destroyOnHide]="true">
    <ngb-panel>
      <ng-template ngbPanelHeader let-opened="opened">
        <button ngbPanelToggle class="btn btn-link p-0 w-100 text-decoration-none card-header-custom">
          Button
        </button>
      </ng-template>
      <ng-template ngbPanelContent>
        <ais-range-slider
          attribute="listings.price"
          [precision]="0">
        </ais-range-slider>
      </ng-template>
    </ngb-panel>
  </ngb-accordion>
<ais-instantsearch [config]="config">

It is not working because that component destroys alll components which are not visible.

Another example with switch case is not also working - and it has parent div inside switch case.

<ng-container [ngSwitch]="filter">
  <ng-container *ngSwitchCase="'price'">
      <!-- price must be present in dom otherwise it causes crashes -->
      <div class="px-3 py-2">
        <ais-range-slider
          attribute="listings.price"
          [precision]="0">
        </ais-range-slider>
      </div>
    </ng-container>
 </ng-container>

Thx.

@francoischalifour
Copy link
Member

It is not working because that component destroys alll components which are not visible.

This will likely be a problem with Angular InstantSearch because as @Haroenv mentioned, unmounted components' search state (i.e., search parameters) are ignored by InstantSearch. This means that when users visually toggle the accordion, the search results might change.

Is there a way to tell ngb-accordion to not destroy the component but just to visually hide it?

@Celtian
Copy link
Author

Celtian commented Feb 15, 2021

@francoischalifour Yes, luckylly there is. But it is making my DOM deeper and it is decresing my Lighthouse score.

I should be possible either pass arguments directely through "SearchRequestParameters" or from another place in DOM.

Still was not explained why "ais-range-slider" causes crashes and for example "ais-refinement-list" not.

@francoischalifour
Copy link
Member

The error seems to happen because we expect the slider container to exist at first render to create the slider instance.

Since ngb-accordion doesn't mount the InstantSearch slider component, this.sliderContainer is undefined, and therefore this.sliderContainer.nativeElement throws.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants