Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

487
Visualizações
Angular 2 Desplazarse hacia abajo (estilo Chat)

Tengo un conjunto de componentes de una sola celda dentro de un bucle ng-for .

Tengo todo en su lugar, pero parece que no puedo averiguar el correcto

Actualmente tengo

 setTimeout(() => { scrollToBottom(); });

Pero esto no funciona todo el tiempo ya que las imágenes empujan la ventana gráfica hacia abajo de forma asincrónica.

¿Cuál es la forma adecuada de desplazarse hasta la parte inferior de una ventana de chat en Angular 2?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Tuve el mismo problema, estoy usando una combinación de AfterViewChecked y @ViewChild (Angular2 beta.3).

El componente:

 import {..., AfterViewChecked, ElementRef, ViewChild, OnInit} from 'angular2/core' @Component({ ... }) export class ChannelComponent implements OnInit, AfterViewChecked { @ViewChild('scrollMe') private myScrollContainer: ElementRef; ngOnInit() { this.scrollToBottom(); } ngAfterViewChecked() { this.scrollToBottom(); } scrollToBottom(): void { try { this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; } catch(err) { } } }

La plantilla:

 <div #scrollMe style="overflow: scroll; height: xyz;"> <div class="..." *ngFor="..." ...> </div> </div>

Por supuesto, esto es bastante básico. AfterViewChecked activa cada vez que se comprueba la vista:

Implemente esta interfaz para recibir notificaciones después de cada verificación de la vista de su componente.

Si tiene un campo de entrada para enviar mensajes, por ejemplo, este evento se activa después de cada pulsación (solo para dar un ejemplo). Pero si guarda si el usuario se desplazó manualmente y luego omite scrollToBottom() , debería estar bien.

over 4 years ago · Santiago Trujillo Relatório

0

La solución más simple y mejor para esto es:

Agregue esta cosa simple #scrollMe [scrollTop]="scrollMe.scrollHeight" en el lado de la plantilla

 <div style="overflow: scroll; height: xyz;" #scrollMe [scrollTop]="scrollMe.scrollHeight"> <div class="..." *ngFor="..." ...> </div> </div>

Aquí está el enlace para la DEMO DE TRABAJO (con la aplicación de chat ficticia) Y EL CÓDIGO COMPLETO

Funcionará con Angular2 y también hasta 5, como la demostración anterior se realiza en Angular5.


Nota :

Por error: ExpressionChangedAfterItHasBeenCheckedError

Verifique su css, es un problema del lado css, no del lado angular. Uno de los usuarios @KHAN lo resolvió eliminando el overflow:auto; height: 100%; de div . (verifique las conversaciones para más detalles)

over 4 years ago · Santiago Trujillo Relatório

0

La respuesta aceptada se dispara mientras se desplaza por los mensajes, esto evita eso.

Quieres una plantilla como esta.

 <div #content> <div #messages *ngFor="let message of messages"> {{message}} </div> </div>

Luego, desea utilizar una anotación ViewChildren para suscribirse a los nuevos elementos de mensaje que se agregan a la página.

 @ViewChildren('messages') messages: QueryList<any>; @ViewChild('content') content: ElementRef; ngAfterViewInit() { this.scrollToBottom(); this.messages.changes.subscribe(this.scrollToBottom); } scrollToBottom = () => { try { this.content.nativeElement.scrollTop = this.content.nativeElement.scrollHeight; } catch (err) {} }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda