Estoy usando angular 5. Tengo un tablero en el que tengo pocas secciones con contenido pequeño y pocas secciones con contenido tan grande que me enfrento a un problema al cambiar el enrutador mientras voy a la parte superior. Cada vez que necesito desplazarme para ir al principio. ¿Alguien puede ayudarme a resolver este problema para que cuando cambie el enrutador mi vista siempre permanezca en la parte superior?
Gracias por adelantado.
Respuestas:
Hay algunas soluciones, asegúrese de revisarlas todas :)
La salida del enrutador emitirá el
activate
evento cada vez que se cree una instancia de un nuevo componente, por lo que podríamos usar(activate)
para desplazarnos (por ejemplo) hacia la parte superior:app.component.html
app.component.ts
Utilice, por ejemplo, esta solución para un desplazamiento suave:
Si desea ser selectivo, digamos que no todos los componentes deben activar el desplazamiento, puede verificarlo en una
if
declaración como esta:Desde Angular6.1, también podemos usar
{ scrollPositionRestoration: 'enabled' }
en módulos cargados con entusiasmo y se aplicará a todas las rutas:También hará el desplazamiento suave, ya. Sin embargo, esto tiene el inconveniente de hacerlo en todas las rutas.
Otra solución es hacer el desplazamiento superior en la animación del enrutador. Agregue esto en cada transición donde desee desplazarse hacia la parte superior:
fuente
window
objeto no funcionan en angular 5. ¿Alguna conjetura por qué?Si enfrenta este problema en Angular 6, puede solucionarlo agregando el parámetro
scrollPositionRestoration: 'enabled'
al RouterModule de app-routing.module.ts:fuente
scrollPositionRestoration
propiedad no funciona con contenido de página dinámico (es decir, donde el contenido de la página se carga de forma asincrónica): consulte este informe de error de Angular: github.com/angular/angular / issues / 24547EDITAR: Para Angular 6+, use la respuesta de Nimesh Nishara Indimagedara mencionando:
Respuesta original:
Si todo falla, cree algún elemento HTML vacío (por ejemplo: div) en la parte superior (o el desplazamiento deseado a la ubicación) con id = "top" en la plantilla (o plantilla principal):
Y en componente:
fuente
Ahora hay una solución integrada disponible en Angular 6.1 con
scrollPositionRestoration
opción.Vea mi respuesta en Angular 2 Desplácese hacia arriba en Cambio de ruta .
fuente
Aunque @Vega proporciona la respuesta directa a su pregunta, existen problemas. Rompe el botón de avance / retroceso del navegador. Si su usuario hace clic en el botón de avance o retroceso del navegador, pierde su lugar y se desplaza hacia la parte superior. Esto puede ser un poco molesto para sus usuarios si tuvieran que desplazarse hacia abajo para llegar a un enlace y decidieran hacer clic hacia atrás solo para encontrar que la barra de desplazamiento se había restablecido a la parte superior.
Aquí está mi solución al problema.
fuente
En mi caso acabo de agregar
en
ngOnInit()
y su funcionamiento muy bien.fuente
Desde la versión angular 6+ No es necesario usar window.scroll (0,0)
Para la versión angular
6+
de @ Representa opciones para configurar el enrutador.docs
Uno puede usar
scrollPositionRestoration?: 'disabled' | 'enabled' | 'top'
enEjemplo:
Y si uno requiere controlar manualmente el desplazamiento, no es necesario usar
window.scroll(0,0)
el paquete común en lugar de Angular V6ViewPortScoller
.El uso es bastante sencillo Ejemplo:
fuente
Si usa mat-sidenav, dé una identificación a la salida del enrutador (si tiene salidas de enrutador para padres e hijos) y use la función de activación
<router-outlet id="main-content" (activate)="onActivate($event)">
y use este selector de consultas 'mat-sidenav-content' para desplazarse hacia arribaonActivate(event) { document.querySelector("mat-sidenav-content").scrollTo(0, 0); }
fuente
id
(tengo unorouter-outlet
en mi aplicación). También lo hice de una manera más 'angular':@ViewChild(MatSidenavContainer) sidenavContainer: MatSidenavContainer; onActivate() { this.sidenavContainer.scrollable.scrollTo({ left: 0, top: 0 }); }
Sigo buscando una solución integrada para este problema como la que hay en AngularJS. Pero hasta entonces, esta solución funciona para mí, es simple y conserva la funcionalidad del botón de retroceso.
app.component.html
app.component.ts
Respuesta de la publicación original de zurfyx
fuente
Solo necesita crear una función que contenga el ajuste del desplazamiento de su pantalla
por ejemplo
window.scrollTo (xpos, ypos) -> parámetro esperado.
fuente
Aquí hay una solución que solo se desplaza a la parte superior del Componente si visita CADA componente por primera vez (en caso de que necesite hacer algo diferente por componente):
En cada componente:
fuente
fuente
Angular 6.1 y posterior:
Puede usar una solución integrada disponible en Angular 6.1+ con la opción
scrollPositionRestoration: 'enabled'
de lograr lo mismo.Angular 6.0 y versiones anteriores:
Nota: El comportamiento esperado es que cuando navega de regreso a la página, debe permanecer desplazada hacia abajo hasta la misma ubicación que estaba cuando hizo clic en el enlace, pero desplazándose hacia la parte superior al llegar a cada página.
fuente
solo agrega
window.scrollTo({ top: 0);
para ngOnInit ()
fuente
Para alguien que está buscando la función de desplazamiento, simplemente agregue la función y llame cuando sea necesario
fuente
Prueba esto:
app.component.ts
fuente
Componente: suscríbase a todos los eventos de enrutamiento en lugar de crear una acción en la plantilla y desplácese en NavigationEnd b / c; de lo contrario, lo activará en navegaciones incorrectas o rutas bloqueadas, etc. Esta es una forma segura de saber si se navega correctamente a una ruta, luego calme el desplazamiento. De lo contrario, no haga nada.
HTML
fuente
prueba esto
este código soporta angular 6 <=
fuente