He encontrado algunos comportamientos no deseados, al menos para mí, cuando cambia la ruta. En el paso 11 del tutorial http://angular.github.io/angular-phonecat/step-11/app/#/phones puede ver la lista de teléfonos. Si te desplazas hacia la parte inferior y haces clic en uno de los últimos, puedes ver que el desplazamiento no está en la parte superior, sino que está en el medio.
También encontré esto en una de mis aplicaciones y me preguntaba cómo puedo hacer que esto se desplace hacia la parte superior. Puedo hacerlo manualmente, pero creo que debería haber otra forma elegante de hacerlo que no conozco.
Entonces, ¿hay una manera elegante de desplazarse hacia la cima cuando cambia la ruta?
fuente
<div class="ng-view" autoscroll></div>
y funciona igual (a menos que desee que el desplazamiento sea condicional).$window.scrollTo(0,0)
en $ stateChangeSuccess oyente de eventosSimplemente ponga este código para ejecutar
fuente
$window.scrollTop(0,0)
funciona mejor para mí que el desplazamiento automático. En mi caso tengo vistas que entran y salen con transiciones.Este código funcionó muy bien para mí ... Espero que también funcione bien para usted ... Todo lo que tiene que hacer es inyectar $ anchorScroll en su bloque de ejecución y aplicar la función de escucha al rootScope como lo hice en el siguiente ejemplo ...
Aquí está el orden de llamada del módulo Angularjs:
app.config()
app.run()
directive's compile functions (if they are found in the dom)
app.controller()
directive's link functions (again, if found)
RUN BLOCK se ejecuta después de crear el inyector y se utiliza para iniciar la aplicación. Esto significa que cuando se redirige a la nueva vista de ruta, el oyente en el bloque de ejecución llama al
y ahora puede ver que el desplazamiento comienza en la parte superior con la nueva vista enrutada :)
fuente
Después de una o dos horas de intentar todas las combinaciones de
ui-view autoscroll=true
,$stateChangeStart
,$locationChangeStart
,$uiViewScrollProvider.useAnchorScroll()
,$provide('$uiViewScroll', ...)
, y muchos otros, no pude conseguir rollo-a-alto-a-new-page de trabajo como se esperaba.Esto fue en última instancia lo que funcionó para mí. Captura pushState y replaceState y solo actualiza la posición de desplazamiento cuando se navega por nuevas páginas (el botón de retroceso / avance conserva sus posiciones de desplazamiento):
fuente
$locationProvider.html5Mode(true);
@wkronkel ¿hay alguna manera de lograr esto cuando no usa el modo HTML5 en angular? Porque la recarga de la página arroja errores 404 debido a que el modo html 5 está activo.run
? el angular tuapp
objeto?run
función es un método disponible en cada objeto de módulo angular.Aquí está mi solución (aparentemente) robusta, completa y (bastante) concisa. Utiliza el estilo compatible de minificación (y el acceso angular.module (NAME) a su módulo).
PD: Encontré que el desplazamiento automático no tenía ningún efecto, ya sea establecido en verdadero o falso.
fuente
Con angularjs UI Router, lo que estoy haciendo es esto:
Con:
Nunca falla en ninguna página, y no es global.
fuente
onEnter: scrollContent
// Your favorite scroll method here
?$('html, body').animate({ scrollTop: -10000 }, 100);
onEnter: scrollContent
en cada vista solo funciona en la primera vista / ruta, no en la segunda. Extraño.Para su información, para cualquiera que se encuentre con el problema descrito en el título (como lo hice yo) y que también está usando el complemento AngularUI Router ...
Como se le preguntó y respondió en esta pregunta SO, el enrutador angular-ui salta al final de la página cuando cambia las rutas.
¿No puedo entender por qué la página se carga en la parte inferior? Problema de desplazamiento automático de UI-Router angular
Sin embargo, como dice la respuesta, puede desactivar este comportamiento diciendo
autoscroll="false"
en suui-view
.Por ejemplo:
http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.directive:ui-view
fuente
puedes usar este javascript
fuente
$location.hash('top')
antes de que$anchorScroll()
los botones predeterminados de avance / retroceso del navegador ya no funcionen; siguen redirigiéndote al hash en la URLSi usa ui-router puede usar (en ejecución)
fuente
Encontré esta solución. Si va a una nueva vista, la función se ejecuta.
fuente
Establecer autoScroll en verdadero no fue el truco para mí, así que elegí otra solución. Construí un servicio que se conecta cada vez que cambia la ruta y que utiliza el servicio incorporado $ anchorScroll para desplazarse hacia arriba. Funciona para mi :-).
Servicio:
Registro:
fuente
Llegué un poco tarde a la fiesta, pero probé todos los métodos posibles y nada funcionó correctamente. Aquí está mi solución elegante:
Yo uso un controlador que gobierna todas mis páginas con ui-router. Me permite redirigir a los usuarios que no están autenticados o validados a una ubicación adecuada. La mayoría de las personas ponen su middleware en la configuración de su aplicación, pero requiero algunas solicitudes http, por lo tanto, un controlador global funciona mejor para mí.
Mi index.html se ve así:
Mi initCtrl.js se ve así:
He probado todas las opciones posibles, este método funciona mejor.
fuente
id="top-nav"
fue importante colocar el elemento correcto.Todas las respuestas anteriores rompen el comportamiento esperado del navegador. Lo que la mayoría de la gente quiere es algo que se desplazará hacia la parte superior si se trata de una página "nueva", pero que volverá a la posición anterior si llega a través del botón Atrás (o Adelante).
Si asume el modo HTML5, esto resulta ser fácil (aunque estoy seguro de que algunas personas brillantes pueden descubrir cómo hacer que esto sea más elegante):
La forma en que funciona es que el enrutador asume que se desplazará hacia la parte superior, pero se demora un poco para darle al navegador la oportunidad de terminar. Si el navegador nos notifica que el cambio se debió a una navegación Atrás / Adelante, cancela el tiempo de espera y el desplazamiento nunca ocurre.
Usé
document
comandos sin procesar para desplazarme porque quiero moverme a la parte superior de la ventana. Si solo deseaui-view
desplazarse, configureautoscroll="my_var"
dónde controlamy_var
utilizando las técnicas anteriores. Pero creo que la mayoría de la gente querrá desplazarse por toda la página si va a la página como "nueva".Lo anterior usa ui-enrutador, aunque podría usar ng-route en su lugar intercambiando
$routeChangeSuccess
por$stateChangeSuccess
.fuente
var routerApp = angular.module('routerApp', ['ui.router']); routerApp.config(function($stateProvider, $urlRouterProvider, $locationProvider) { $urlRouterProvider.otherwise('/home'); $locationProvider.html5Mode(false).hashPrefix(""); $stateProvider // HOME STATES AND NESTED VIEWS ======================================== .state('home', { url: '/home', templateUrl: 'partial-home.html' }) });
.state('web', { url: '/webdev', templateUrl: 'partial-web.html', controller: function($scope) { $scope.clients = ['client1', 'client2', 'client3']; // I put it here } })
Solo estoy aprendiendo estas cosas, tal vez me estoy perdiendo algo: DNinguna de las respuestas proporcionadas resolvió mi problema. Estoy usando una animación entre vistas y el desplazamiento siempre sucedería después de la animación. La solución que encontré para que el desplazamiento hacia la parte superior suceda antes de la animación es la siguiente directiva:
Lo inserté en mi vista de la siguiente manera:
fuente
Solución simple, agregue
scrollPositionRestoration
el módulo de ruta principal habilitado.Me gusta esto:
fuente
Pruebe esto http://ionicframework.com/docs/api/service/ $ ionicScrollDelegate /
Se desplaza al principio de la lista scrollTop ()
fuente
Finalmente obtuve lo que necesitaba.
Necesitaba desplazarme hacia la parte superior, pero quería algunas transiciones para no
Puede controlar esto en un nivel de ruta por ruta.
Estoy combinando la solución anterior por @wkonkel y agregando un
noScroll: true
parámetro simple a algunas declaraciones de ruta. Entonces estoy captando eso en la transición.En resumen: Este flota en la parte superior de la página en nuevas transiciones, que no flote a la parte superior de
Forward
/Back
transiciones, y se le permite invalidar este comportamiento si es necesario.El código: (solución anterior más una opción adicional noScroll)
Pon eso en tu
app.run
bloque e inyecta$state
...myApp.run(function($state){...})
Luego, si no desea desplazarse hasta la parte superior de la página, cree una ruta como esta:
fuente
Esto funcionó para mí, incluido el desplazamiento automático
<div class="ngView" autoscroll="true" >
fuente