2014-04-01 13 views
18

Ich verbringe meine ersten paar Stunden mit Angular JS und versuche ein SPA damit zu schreiben. Beim Ändern der Route bleibt die Bildlaufposition jedoch nach dem Ändern der Routen an ihrer aktuellen Position. Dies bedeutet, dass, wenn jemand die Hälfte des Textes auf Seite zwei durchliest, diese Person in der Mitte der Seite endet, wenn zwei auf die zweite Seite wechseln. (Vorausgesetzt, die Seiten sind gleich lang.)Wie setze ich die Bildlaufposition bei einer Routenänderung zurück?

Wenn ich nach Lösungen suche, finde ich nur Leute, die nach dem Gegenteil fragen, d. H. Sie wollen die Scroll-Position nicht ändern, wenn sie die Seiten wechseln. Ich habe es jedoch nicht geschafft, auch nur das zu reproduzieren. Ich frage mich, ob die Entwicklung von Angular JS weiter voranging und die Quellen, die ich konsultierte, überholt waren.

habe ich eine Minimalversion, die mein Problem veranschaulicht (fügen Sie einfach zwei Dateien sample1.html und sample2.html mit zufälligem Inhalt es funktioniert.):

<!DOCTYPE html> 
<html> 
<head lang="en"><title>SPA sample</title></head> 
<body data-ng-app="myApp"> 
<div style="position: fixed;"> 
    <a href="#/">Main</a> 
    <a href="#/other">Tutorial</a> 
</div> 
<div data-ng-view=""></div> 
<script src="http://code.angularjs.org/1.2.9/angular.min.js"></script> 
<script src="http://code.angularjs.org/1.2.9/angular-route.min.js"></script> 
<script> 
    var myApp = angular.module('myApp', ['ngRoute']); 
    myApp.config(function ($routeProvider) { 
     $routeProvider 
       .when('/', { 
        controller: 'noOp', 
        templateUrl: 'sample1.html' 
       }) 
       .when('/other', { 
        controller: 'noOp', 
        templateUrl: 'sample2.html' 
       }) 
       .otherwise({redirectTo: '/'}); 
    }); 
    myApp.controller('noOp', function ($scope) { }); 
</script> 
</body> 
</html> 
+0

Sie könnten der Suche nach [$ anchorScroll] (http://docs.angularjs.org/ api/ng/service/$ AnkerScroll). – miqid

+0

Ich lese es durch. Also sollte der Controller, der jetzt noop ist, diese Ankerrolle bekommen und anwenden? Entschuldigung, ich bin zu eckig ziemlich neu. –

Antwort

39

Gemäß der ngView Dokumentation:

Autoscroll (optional) string:

Ob ngView sollte $ anchorScroll rufen Sie das Ansichtsfenster nach die Ansicht aktualisiert wird, blättern.

Also alles, was Sie tun müssen, ist Ihre ng-view Anruf ändern auf Autoscroll drehen wie so:

<div ng-view autoscroll></div> 
+0

Obige Antwort hat mein halbes Problem gelöst, ich möchte dasselbe auch beim Seitenladen machen. Könnten Sie bitte erläutern, wie das gemacht werden kann? –

+0

Vielen Dank @Matt – kaxi1993

11

Nach jeder Routenänderung ein Ereignis dort auf den $rootScope gebrannt wird : $routeChangeSuccess. Im einfachsten Szenario hören nur auf dieses Ereignis und setzen Sie die Bildlaufposition zu (0,0):

$rootScope.$on("$routeChangeSuccess", function(){ 
    window.scrollTo(0,0); 
}) 

In etwas fortgeschritteneren Fall, dass Sie für jede URL speichern kann, die letzte Position vor der URL zu verlassen - dann Sie sollten zuhören: $routeChangeStart auch. Sehr primitiv könnte die Speicherung auf der $rootScope selbst vorgenommen werden, aber ich würde lieber JS-Hash-Objekt verwenden und es als einfachen Winkelwert stattdessen beibehalten. Wenn die letzte Position dauerhaft gespeichert werden soll (z. B. in localStorage), können Sie die Verwendung von Winkelservices in Betracht ziehen.

+0

Kontinuierliches Abhören des Bildfenster-Scrollens scheint erforderlich zu sein, da bei einem Klick auf die Schaltfläche oder beim Zurück-Klick ein Event zu spät zum Aufzeichnen des Offsets erfolgt. – Srg

+0

@Srg lädt Ihre Seite vollständig neu oder ist es ein SPA? wenn letzteres dann bin ich mir ziemlich sicher, dass dreckige Überprüfung nicht erforderlich ist. –

+0

Ich habe noch ein SPA zu sehen, das die jetzt 1 Jahr alte iOS7 bfCache Navigation mit ** swipes ** sauber unterstützt. Das Problem ist, dass es Zeit braucht, um Änderungen an einer Seite vorzunehmen, und es gibt einfach keine. Wenn Sie es nicht bemerkt haben, (greifen Sie auf iOS7 + Gerät, öffnen Sie ein SPA, Drill-Down,) wischen zurück fast bis zum Ende, werfen Sie einen guten Blick und dann loslassen. Es gibt immer einen bemerkbaren Fehler, während das SPA in den vorherigen Zustand zurückkehrt. – Srg

Verwandte Themen