2013-03-18 8 views
6

Sto usando del scrollTo e anchorScroll come questo angolare:Come fermare angolare per ricaricare quando l'indirizzo cambia

app.controller('TestCtrl', function($scope, $location, $anchorScroll) { 
    $scope.scrollTo = function(id) { 
     $location.hash(id); 
     $anchorScroll(); 
    } 
}); 

<a ng-click="scrollTo('foo')">Foo</a> 

<div id="foo">Here you are</div> 

Il mio problema è che quando clicco sul collegamento la pagina scorre verso il basso, ma nel 50% dei casi le la pagina si ricarica perché l'hash cambia nell'URL.

Come si impedisce a Angular di ricaricare la pagina?

Update: Ho scoperto che qui

https://groups.google.com/forum/?fromgroups=#!msg/angular/BY2ekZLbnIM/MORF-z2vHnIJ

che

The $location service broadcasts a $locationChangeStart event. You can observe that and call event.preventDefault() to stop the navigation. Nice!

qualcuno può dire come osservare quell'evento ed evitare di default

risposta

1

Questo evento viene emesso sul rootScope, così puoi registrare un osservatore usando 01 Metodo.

$scope.$on('$locationChangeStart', function(ev) { 
    ev.preventDefault(); 
}); 
+0

ho messo che nella funzione scrollTo e funziona ma il problema è poi il mio altro click sul lato sinistro del menu si interrompe il lavoro perché anche questo sta modificando l'hash. come posso impedirlo solo quando clicco su link particualr solo – user1865341

+0

non sono sicuro se puoi. Probabilmente dovrai gestire anche questi collegamenti con '$ anchorScroll() 'o ripensare il tuo design. A proposito, questo frammento entra nella funzione del tuo controller non nella funzione 'scrollTo'. – cezar

6

È possibile aggiungere $ parametro dell'evento sul gestore ng-clic:

<a ng-click="scrollTo('foo', $event)">Foo</a> 

e nella funzione scrollTo si può fare la prossima:

scope.scrollTo = function(str, event) { 
    event.preventDefault(); 
    event.stopPropagation(); 

    /** SOME OTHER LOGIC */ 
} 

Ma questo significa che si dovrebbe analizzare un hash dell'ancora di destinazione da un elemento "a" manualmente.

9

L'aggiornamento sta accadendo perché c'è una chiamata all'evento locationChangeStart. Ci si può fermare questo facendo:

scope.$on('$locationChangeStart', function(ev) { 
    ev.preventDefault(); 
}); 

realtà ho finito per scrivere la mia direttiva scrollTo che utilizza questa chiamata all'interno di esso.

Plnkr/Github

My other post about this here

Problemi correlati