J'ai trouvé un comportement indésirable, du moins pour moi, lorsque l'itinéraire change. À l'étape 11 du didacticiel http://angular.github.io/angular-phonecat/step-11/app/#/phones, vous pouvez voir la liste des téléphones. Si vous faites défiler vers le bas et cliquez sur l'un des derniers, vous pouvez voir que le défilement n'est pas en haut, mais plutôt au milieu.
J'ai également trouvé cela dans l'une de mes applications et je me demandais comment puis-je faire défiler vers le haut. Je peux le faire manuellement, mais je pense qu'il devrait y avoir une autre manière élégante de le faire que je ne connais pas.
Alors, existe-t-il un moyen élégant de faire défiler vers le haut lorsque l'itinéraire change?
la source
<div class="ng-view" autoscroll></div>
et cela fonctionne de la même manière (sauf si vous vouliez rendre le défilement conditionnel).$window.scrollTo(0,0)
dans l'écouteur d'événements $ stateChangeSuccessIl suffit de mettre ce code à exécuter
la source
$window.scrollTop(0,0)
fonctionne mieux pour moi que le défilement automatique. Dans mon cas, j'ai des vues qui entrent et sortent avec des transitions.Ce code a très bien fonctionné pour moi .. J'espère qu'il fonctionnera également très bien pour vous .. Tout ce que vous avez à faire est d'injecter simplement $ anchorScroll à votre bloc d'exécution et d'appliquer la fonction d'écoute au rootScope comme je l'ai fait dans l'exemple ci-dessous ..
Voici l'ordre d'appel du module 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 est exécuté après la création de l'injecteur et est utilisé pour démarrer l'application .. cela signifie que lorsque vous êtes redirigé vers la nouvelle vue de route, l'écouteur du bloc d'exécution appelle le
et vous pouvez maintenant voir le défilement commencer vers le haut avec la nouvelle vue routée :)
la source
Après une heure ou deux d'essayer toutes les combinaisons de
ui-view autoscroll=true
,$stateChangeStart
,$locationChangeStart
,$uiViewScrollProvider.useAnchorScroll()
,$provide('$uiViewScroll', ...)
, et bien d' autres, je ne pouvais pas défiler à haut sur la page nouvelle au travail comme prévu.C'est finalement ce qui a fonctionné pour moi. Il capture pushState et replaceState et ne met à jour la position de défilement que lorsque de nouvelles pages sont parcourues (les boutons Précédent / Suivant conservent leurs positions de défilement):
la source
$locationProvider.html5Mode(true);
@wkronkel existe-t-il un moyen d'accomplir cela lorsque vous n'utilisez pas le mode HTML5 en angulaire? Le rechargement de la page génère des erreurs 404 en raison de l'.run
? l'angulaire de votreapp
objet?run
fonction est une méthode disponible sur chaque objet module angulaire.Voici ma solution (apparemment) robuste, complète et (assez) concise. Il utilise le style compatible avec la minification (et l'accès angular.module (NAME) à votre module).
PS J'ai trouvé que la fonction de défilement automatique n'avait aucun effet, qu'elle soit définie sur true ou false.
la source
En utilisant angularjs UI Router, ce que je fais est le suivant:
Avec:
Il n'échoue jamais sur aucune page et n'est pas global.
la source
onEnter: scrollContent
// Your favorite scroll method here
?$('html, body').animate({ scrollTop: -10000 }, 100);
onEnter: scrollContent
sur chaque vue, cela ne fonctionne que sur la première vue / route, pas sur la deuxième. Étrange.Pour info pour toute personne rencontrant le problème décrit dans le titre (comme je l'ai fait) qui utilise également le plugin AngularUI Router ...
Comme demandé et répondu dans cette question SO, le routeur angular-ui saute au bas de la page lorsque vous changez de route.
Vous ne pouvez pas comprendre pourquoi la page se charge en bas? Problème de défilement automatique de l'interface utilisateur angulaire
Cependant, comme l'indique la réponse, vous pouvez désactiver ce comportement en disant
autoscroll="false"
sur votreui-view
.Par exemple:
http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.directive:ui-view
la source
vous pouvez utiliser ce javascript
la source
$location.hash('top')
avant$anchorScroll()
les boutons de navigation avant / arrière par défaut ne fonctionnent plus; ils continuent de vous rediriger vers le hachage dans l'URLSi vous utilisez ui-router, vous pouvez utiliser (en cours d'exécution)
la source
J'ai trouvé cette solution. Si vous passez à une nouvelle vue, la fonction est exécutée.
la source
Définir autoScroll sur true n'a pas été un truc pour moi, j'ai donc choisi une autre solution. J'ai créé un service qui se connecte à chaque fois que l'itinéraire change et qui utilise le service $ anchorScroll intégré pour faire défiler vers le haut. Travaille pour moi :-).
Un service:
Enregistrement:
la source
Un peu tard pour la fête, mais j'ai essayé toutes les méthodes possibles, et rien n'a fonctionné correctement. Voici ma solution élégante:
J'utilise un contrôleur qui régit toutes mes pages avec ui-router. Cela me permet de rediriger les utilisateurs qui ne sont pas authentifiés ou validés vers un emplacement approprié. La plupart des gens mettent leur middleware dans la configuration de leur application, mais j'avais besoin de quelques requêtes http, donc un contrôleur global fonctionne mieux pour moi.
Mon index.html ressemble à:
Mon initCtrl.js ressemble à:
J'ai essayé toutes les options possibles, cette méthode fonctionne le mieux.
la source
id="top-nav"
élément sur l'élément correct.Toutes les réponses ci-dessus interrompent le comportement attendu du navigateur. Ce que la plupart des gens veulent, c'est quelque chose qui défilera vers le haut s'il s'agit d'une "nouvelle" page, mais reviendra à la position précédente si vous y arrivez via le bouton Précédent (ou Suivant).
Si vous assumez le mode HTML5, cela se révèle facile (même si je suis sûr que certaines personnes brillantes peuvent trouver comment rendre cela plus élégant!):
La façon dont cela fonctionne est que le routeur suppose qu'il va défiler vers le haut, mais tarde un peu pour donner au navigateur une chance de terminer. Si le navigateur nous informe alors que le changement est dû à une navigation en arrière / en avant, il annule le délai d'attente et le défilement ne se produit jamais.
J'ai utilisé des
document
commandes brutes pour faire défiler, car je veux passer en haut de la fenêtre. Si vous voulez juste que votreui-view
défilement, définissezautoscroll="my_var"
où vous contrôlez enmy_var
utilisant les techniques ci-dessus. Mais je pense que la plupart des gens voudront faire défiler la page entière si vous allez sur la page comme "nouvelle".Ce qui précède utilise ui-router, bien que vous puissiez utiliser ng-route à la place en échangeant
$routeChangeSuccess
pour$stateChangeSuccess
.la source
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 } })
J'apprends juste ce truc, peut-être que je manque quelque chose: DAucune des réponses fournies n'a résolu mon problème. J'utilise une animation entre les vues et le défilement se produira toujours après l'animation. La solution que j'ai trouvée pour que le défilement vers le haut se produise avant l'animation est la directive suivante:
Je l'ai inséré à mon avis comme suit:
la source
Solution simple, ajoutez
scrollPositionRestoration
le module de route principal activé.Comme ça:
la source
Essayez ceci http://ionicframework.com/docs/api/service/ $ ionicScrollDelegate /
Il défile en haut de la liste scrollTop ()
la source
J'ai enfin obtenu ce dont j'avais besoin.
Je devais faire défiler vers le haut, mais je voulais que certaines transitions ne
Vous pouvez contrôler cela au niveau itinéraire par itinéraire.
Je combine la solution ci-dessus par @wkonkel et j'ajoute un simple
noScroll: true
paramètre à certaines déclarations de route. Ensuite, je l'attrape dans la transition.Dans l'ensemble: cela flotte en haut de la page sur les nouvelles transitions, il ne flotte pas en haut sur
Forward
/Back
transitions, et il vous permet de remplacer ce comportement si nécessaire.Le code: (solution précédente plus une option noScroll supplémentaire)
Mettez ça dans votre
app.run
bloc et injectez$state
...myApp.run(function($state){...})
Ensuite, si vous ne souhaitez pas faire défiler vers le haut de la page, créez un itinéraire comme celui-ci:
la source
Cela a fonctionné pour moi, y compris le défilement automatique
<div class="ngView" autoscroll="true" >
la source