2013-03-18 12 views
6

Używam kątowa na scrollTo i anchorScroll tak:Jak zatrzymać kątowa przeładować gdy adres zmienia

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> 

Moim problemem jest to, że po kliknięciu w link przewija stronę w dół, ale w 50% przypadków strona przeładowuje się, ponieważ zmiany hash w adresie URL.

Jak mogę zapobiec przeładowaniu strony przez Angular?

Aktualizacja: I odkryli, że tutaj

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

że

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

może ktoś powiedzieć jak obserwować to wydarzenie i zapobiec Wartość domyślna

Odpowiedz

1

To zdarzenie jest emitowana na rootScope, dzięki czemu można zarejestrować obserwatora za pomocą $on metoda.

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

Włożyłem że funkcja scrollTo i to działa, ale problemem jest to mój drugi click po lewej stronie menu po stronie przestaje działać, ponieważ jest to również chnidowanie skrótu. jak mogę temu zapobiec tylko wtedy, gdy kliknie się na konkretne linki tylko – user1865341

+0

Nie jestem pewien, czy potrafisz. Prawdopodobnie będziesz musiał również zarządzać tymi linkami za pomocą '$ anchorScroll()' lub ponownie przemyśleć swój projekt. Nawiasem mówiąc, ten fragment trafia do funkcji kontrolera nie w funkcji 'scrollTo'. – cezar

6

Możesz dodać $ parametr zdarzeń na ng-click obsługi:

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

i funkcji scrollTo można zrobić następny:

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

    /** SOME OTHER LOGIC */ 
} 

Ale to oznacza, że ​​powinniśmy Przetwórz docelowy skrót kontrolny z elementu "a" ręcznie.

9

odświeżania się dzieje, ponieważ nie jest to wezwanie do wypadku locationChangeStart. Można temu zapobiec, wykonując:

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

I rzeczywiście skończyło się pisać własne dyrektywę scrollTo który używa tego połączenia wewnątrz niego.

Plnkr/Github

My other post about this here

Powiązane problemy