Прокрутите до класса в angular 5

Очень простой вопрос, как я могу перейти к классу в angular, часами искал, чтобы эта работа заработала, так что расстраивает У меня есть компонент календаря, и когда я выбираю день, события этого дня открываются под ним.

Работает с чистым javascript для идентификатора, но не для класса

 const elmnt = document.getElementById('scrollto');
 elmnt.scrollIntoView(true);

У меня также есть jQuery, но это вообще не прокрутка

 if ($('.call-open').length > 0) {
      $('html, body').animate({
        scrollTop: $('.call-open').offset().top
      }, 2000);
    }

этот класс .call-open добавляется после того, как я нажимаю день, может быть, поэтому

Я пробовал плагин это, но он ничего не делает, даже с простой кнопкой примера

Я не могу быть единственным, у кого есть эта проблема, но я не могу найти никакого рабочего решения, sometines angular - заноза в заднице для таких простых вещей, как эта

Похоже на проблему синхронизации, если элементы добавляются или классы устанавливаются после события щелчка. Введите небольшую задержку с помощью setTimeout() перед вызовом кода в качестве теста.

Brandon 25.04.2018 16:01

это может вам помочь stackoverflow.com/a/49875416/4399281

Fateh Mohamed 25.04.2018 16:02

@FatehMohamed это для маршрутизации

Ruben 25.04.2018 17:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
1 382
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

попробуйте это с таймаутом

scroll(){
 setTimeout(() => {
    const classElement = document.getElementsByClassName('scrollTo');
    if (classElement.length > 0){
      classElement[0].scrollIntoView();
    }
 }
 }, 100);
}
Ответ принят как подходящий

это работает, но, черт возьми, это уродливо

 window.setTimeout(() => {
  if ($('.cal-open').length > 0) {
    $('html, body').animate({
      scrollTop: $('.cal-open').offset().top - 80
    }, 100);
  }
}, (250));

и мне нужен jQuery, мне он нужен для чего-то еще на этой странице, но все же решения без jQuery были бы хороши

Ruben 25.04.2018 18:18

Я решил эту проблему с помощью следующего кода:

  constructor(private el: ElementRef) { }

  scrollToFirstInvalidControl() {
    const firstInvalidControl: HTMLElement = this.el.nativeElement.querySelector(
      "class-name"
    );
    if (!firstInvalidControl) return false
    window.scroll({
      top: this.getTopOffset(firstInvalidControl),
      left: 0,
      behavior: "smooth"
    });
  }

  getTopOffset(controlEl: HTMLElement): number {
    const labelOffset = 50;
    return controlEl.getBoundingClientRect().top + window.scrollY - labelOffset;
  }

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