Как сбросить прокрутку при изменении маршрута в Ember 3?

Я пытаюсь использовать hook activate, didTransition или willTransition, но ничего из этого не работает, они вообще ничего не делают. Стараюсь начать по одному маршруту:

// app/routes/section.js
import Route from '@ember/routing/route';

export default class SectionRoute extends Route { 
  ...

  activate() { scroll(0, 0); }
}
<!-- app/templates/section.hbs -->
<h1>{{model.title}}</h1>
<p>{{model.body}}</p>
{{outlet}}
{{#each model.subsections as |s| }}
  <Section @section={{s}} />
{{/each}}

Это работает в моей консоли браузера js:

scroll(0, 0);

Это мой роутер

// app/router.js
...
Router.map(function() {
  this.route('docs');
  this.route('section', { path: '/docs/section/:slug' });
});

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

Когда я удаляю этот кусок CSS, он работает.

html {
  scroll-behavior: smooth;
}

1 ответ

Ваш подход работает так, как ожидалось. Я создал Ember Twiddle, чтобы проверить это, вы можете найти здесь. Имеет два маршрута. Один, который прокручивается вверх при активации, а другой, который прокручивается вниз при активации. Прокручивается, как и ожидалось.

Я думаю, у вас могут возникнуть проблемы с перехватчиком при переходе между подмаршрутами? Маршрут считается, чтобы оставаться активным и активировать крюк не называется

  • если переход не изменяет маршрут, а только динамические сегменты или параметры запроса, используемые для маршрута, или
  • если происходит переход между подмаршрутами этого маршрута.

Если вы хотите иметь прокрутку вверх при каждом переходе или хотите иметь более детальный контроль, какие переходы должны запускать эту прокрутку, я бы рекомендовал использовать routeDidChange событие RouterService вместо.

Другие вопросы по тегам