scrollIntoView для привязки к различным компонентам - PullRequest
0 голосов
/ 27 января 2020

У меня есть Angular 8 SPA с фиксированной верхней панелью навигации для автоматической прокрутки пользователя до раздела, по которому он щелкнул.

enter image description here

Во-первых, я использовал простой href="#section1". Когда пользователь нажимает на ссылку в навигационной панели, соответствующий раздел отображается правильно. Но я хотел сделать это гладко, поэтому я решил вместо этого использовать метод scrollIntoView, как показано здесь .

К сожалению, похоже, он не работает. Метод scrollToElement() находится в navbar component, а целевой раздел находится в другом компоненте (на данный момент, app component, но это изменится в будущем ...). Поскольку якорь находится в другом компоненте, когда я нажимаю <a>, элемент не определен, и я получаю эту ошибку в консоли: ERROR TypeError: Cannot read property 'scrollIntoView' of undefined

app.component.html

...
<div #section1></div>
<div #section2></div>
<div #section3></div>
<div #section4></div>
...

navbar.component.html

... 
<li class="nav-item">
  <a (click)="scrollToElement(section1)" class="nav-link">Section1</a>
</li>
...

navbar.component.ts

...
scrollToElement($element: any): void {
    console.log($element); //returns undefinded
    $element.scrollIntoView({ //throws an error because $element is undefined
      behavior: "smooth",
      block: "start",
      inline: "nearest"
    });
  }
...

Я думаю, у меня проблема, но Я не понимаю, как это решить. Стоит ли использовать переменную в navbar.component.ts для хранения элемента перед использованием метода scrollIntoView?

Заранее спасибо за помощь!

решено

navbar.component.html

... 
<li class="nav-item">
  <a (click)="scrollToElement('#section1')" class="nav-link">Section1</a>
</li>
...

navbar.component.ts

...
  scrollToElement(selector) {
    const element = document.querySelector(selector)
    element ? element.scrollIntoView({behavior: "smooth"}): null;
  }
...

1 Ответ

0 голосов
/ 27 января 2020

Я думаю, что вы обращаетесь к своей ссылке на переменную в другом компоненте

Вы объявляете свою переменную в app.component. html, и вы пытаетесь получить доступ к этим переменным из navbar.component. html, который не работает в angular.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...