2014-06-01 19 views
6

Ad esempio:angularJS non scorre verso l'alto dopo aver modificato una vista

Un utente scorre verso il basso sulla vista A;

Quindi l'utente fa clic su un collegamento, che consente all'utente di visualizzare B;

La vista è modifiche, ma la posizione verticale dell'utente rimane la stessa e deve scorrere manualmente nella parte superiore dello schermo.

È un bug angolare?

Ho scritto una piccola soluzione alternativa che utilizza jquery per scorrere verso l'alto; ma non trovo l'evento corretto per legarlo a

modificare dopo aver visto il commento:

Come e quando devo tirarmi verso l'alto? sto usando jquery ma l'evento $ viewContentLoaded è troppo presto (il metodo funziona, ma la pagina non scorre in quel momento)

+0

altezza Probabilmente avete fisso o qualcosa del genere. La modifica della vista angolare rimuove il contenuto da ng-view e lo sostituisce con il nuovo contenuto. Per un momento l'altezza di ng-view == 0. Quindi, se rimani in fondo alla pagina significa che quella pagina non ha motivo di riportarti in cima (nessuna variazione di altezza). –

+0

Puoi avvolgere il tuo codice a scorrimento in un '$ timeout' con un timeout molto breve, come 100ms. –

risposta

1

Sembra che tu capisca perché il problema sta accadendo in base al commento di @ jarrodek.

Per quanto riguarda una soluzione, è possibile seguire la soluzione di @TongShen di avvolgere la propria funzione in un $timeout oppure è possibile inserire la chiamata di funzione nel parziale che si sta caricando.

<!-- New partial--> 
<div ng-init="scrollToTop()"> 

</div> 

Se si visualizza il cambiamento è sparato dopo un evento click, si potrebbe anche mettere la chiamata di funzione su quell'elemento. Comunque, arriva solo al tempismo. Dipende solo da come sono impostate le cose.

8

Angolare non scorre automaticamente verso l'alto quando si carica una nuova vista, ma mantiene semplicemente la posizione di scorrimento corrente.

Ecco la soluzione che uso:

myApp.run(function($rootScope, $window) { 

    $rootScope.$on('$routeChangeSuccess', function() { 

    var interval = setInterval(function(){ 
     if (document.readyState == 'complete') { 
     $window.scrollTo(0, 0); 
     clearInterval(interval); 
     } 
    }, 200); 

    }); 
}); 

metterlo in bootstrap (di solito chiamati app.js).

È una soluzione javascript pura (è sempre meglio non usare jQuery se è facile).

Spiegazione: Lo script controlla ogni 200 ms se il nuovo DOM è completamente caricato e quindi scorre verso l'alto e interrompe il controllo Ho provato senza questo ciclo 200ms e a volte non è riuscito a scorrere perché la pagina non era completamente visualizzata.

+0

Questo è un grande amico, grazie :) – Will

Problemi correlati