Существует замечательный паттерн оптимизации рендеринга больших наборов данных, называемый виртуальной прокруткой. В этом конкретном случае я использую https://material.angular.io/cdk/scrolling/overview, чтобы получить такое поведение. Тем не менее, у меня есть требование, когда пользователь переходит на другую страницу и возвращается, пользователь должен находиться в том конкретном месте, которое он покинул (например, перешел к деталям элемента 3498, а когда возвращается, должно начинаться с элемента 3498, а не элемента 1). Как лучше всего этого добиться?
Как вернуться к той же порции набора данных при виртуальной прокрутке?
Ответы (3)
Вы можете ввести CdkVirtualScrollViewport
дочерний элемент представления:
@ViewChild(CdkVirtualScrollViewport) virtualScroll: CdkVirtualScrollViewport;
затем вы можете поиграть с такими методами, как this.getOffsetToRenderedContentStart()
и this.setRenderedContentOffset()
, чтобы сохранить и восстановить исходное местоположение прокрутки.
Вы можете, например, хранить эту информацию внутри службы или локального хранилища.
Реализовал то, что предложил Франческо Борци, и он отлично работает. вот stackblitz реализация. Большая часть действий происходит в файле cdk-virtual-scroll-overview-example.
Стоит отметить, что есть еще пара полезных методов: measureScrollOffset и scrollToOffset. Метод measureScrollOffset:
Получает текущее смещение прокрутки от начала области просмотра (в пикселях).
Таким образом, он принимает во внимание то, что видит пользователь, а не отображаемый контент - например, getOffsetToRenderedContentStart - для этого метода я не мог получить относительные небольшие значения прокрутки.