Renderer устарел как услуга для renderer2, альтернатива для `invokeElementMethod`?

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

Чтобы сделать это, я решил использовать ViewChildren для компонента, чтобы найти последнее сообщение (последнее) и использовать scrollIntoView на nativeElement.

Чтобы не вызвать метод, напрямую обратившись к DOM API nativeElement.scrollIntoView(). Я считаю, что мне нужно будет использовать renderer.invokeElementMethod(nativeElement, 'scrollIntoView').

Проблема renderer устарела в пользу renderer2, и я не могу найти альтернативы для метода invokeElementMethod в renderer2.

Вопрос: есть ли метод, который я пропустил в renderer2, который делает именно это? или у нас есть новый способ сделать вызов метода элемента сейчас?

Ответ 1

Вы можете использовать метод selectRootElement для Renderer2.

Например:

constructor(private renderer: Renderer2) {}

this.renderer.selectRootElement('#domElementId').scrollIntoView()

где domElementId равен id = 'domElementId' в вашем html


ОБНОВИТЬ

Предоставьте второй аргумент для selectRootElement в соответствии с официальной документацией Angular, поскольку он используется для сохранения вашего контента.

selectRootElement(selectorOrNode: any, preserveContent?: boolean): any

this.renderer
  .selectRootElement'#domElementId', true)  // Supply true for the 2nd arg to make sure your content is preserved.
  .scrollIntoView()                      // Or ({ behavior: 'smooth' }) for smooth scrolling

Ответ 2

Угловое обновление Renderer2

Добавил демо Stackblitz для его фактического поведения

Используйте Renderer2 и SelectRootElement, но не забудьте указать второй аргумент

Укажите второй параметр для selectRootElement в соответствии с официальной документацией Angular для сохранения вашего контента.

selectRootElement(selectorOrNode: any, preserveContent?: boolean): any

this.renderer
       .selectRootElement'#elementId', true)  // Supply true for the 2nd arg to make sure your content is preserved.
       .scrollIntoView()                      // Or ({ behavior: 'smooth' }) for smooth scrolling

Ответ 3

Позвольте ответить на это с помощью exapmple:

Если у нас есть вид:

<input #inp1 type="text" placeholder="focus on me" />

Внутри ngAfterViewInit() его нужно сфокусировать следующим образом:

this.renderer.selectRootElement("inp1").scrollIntoView();