2014-10-14 10 views
10

Mam pewne problemy ze zrozumieniem, jak uzyskać pozycję przewijania okna w moim kontrolerze, dzięki czemu mogę zbudować wokół niego logikę.Kątowe i uzyskiwanie pozycji przewijania okna w kontrolerze

Ze wszystkich pytań i odpowiedzi, które czytałem, najczęściej przyjmowaną odpowiedzią wydaje się napisanie dyrektywy obliczającej pozycję przewijania, przyklejającej tę dyrektywę do elementu i to wszystko.

Jednak, gdy chcesz zrobić coś wzdłuż linii:

if (scrollY > 100){ 
    $scope.showMenu = true; 
} 

if (scrollY > 500) { 
    $scope.showFooter = true; 
} 

Takie podejście nie wydaje się działać, ponieważ obliczona pozycja w dyrektywie nie mogą być dostępne ze sterownika. Jaki byłby odpowiedni "kątowy" sposób robienia tego, co pozwoliłoby na wykonanie nieco bardziej skomplikowanej logiki ze sterownika?

+2

Powiąż zmienną zakresu kontrolera z izolowanym zakresem dyrektywy i wprowadź logikę do kontrolera dyrektywy. – Angad

+0

@ singh101 dokładnie. – Linial

+0

@Angad, Linial, czy można to zilustrować przykładem? Proszę? :) – Squrler

Odpowiedz

11

Według @RobKohr komentarzu, oto zoptymalizowane podejście używając .on('scroll') i $scope.$apply zaktualizować element zakres na zwoju.

$document.on('scroll', function() { 
    // do your things like logging the Y-axis 
    console.log($window.scrollY); 

    // or pass this to the scope 
    $scope.$apply(function() { 
     $scope.pixelsScrolled = $window.scrollY; 
    }) 
}); 
+0

Będziesz otrzymywać większą ziarnistość na pozycji przewijania, ponieważ reaguje ona na zdarzenie natywnego przewijania, ale za każdym razem, gdy uruchamiasz, będziesz rzucał zasięg kątowy przez '$ apply'. To zdecydowanie nie jest zoptymalizowane. Zamiast tego odwołaj się do mojego komentarza w odpowiedzi na RobKhor: "requestAnimationFrame" jest drogą do zrobienia. Unikaj dotykania zakresu za wszelką cenę! –

+0

O ile pamiętam, potrzebowałem '$ scope.pixelsScrolled' w wielu miejscach na mojej stronie internetowej, dzięki czemu mogłem go utrzymać i utrzymywałem dobre wyniki na to, o co prosiłem. –

+0

Ale jeśli kiedykolwiek ktoś ma problemy z wydajnością, nadal może dołączyć dowolną logikę (np. RAF), gdzie "console.log" znajduje się na moim fragmencie. –

7

wstrzyknąć usługę $window do kontrolera, który jest po prostu otoki wokół obiektu przeglądarka window i masz $window.scrollX i $window.scrollY właściwości.

Jeśli chcesz reagować na zmiany w zwoju, położyć zegarek na nich:

$scope.$watch(function() { 
    return $window.scrollY; 
}, function (scrollY) { 
    /* logic */ 
}); 
+2

To nie działa dla mnie. Używanie Angular 1.4.0. –

+1

Pracowałem dla mnie. Trochę powolny. Wydaje się nie aktualizować często – RobKohr

+0

@RobKohr Agreed. Pytanie sugeruje ustawienie zmiennej zasięgu, gdy zmienia się pozycja przewijania, więc "$ scope. $ Watch" ma najwięcej sensu, ale powinienem również wspomnieć, że 'requestAnimationFrame' powinno być używane do takich operacji malowania jak ta. W takim przypadku wszelkie zmiany zmiennych zasięgu powinny być zawijane wewnątrz funkcji '$ scope. $ Apply', inaczej nie zostaną wykryte przez Angular - mała niedogodność dla zwiększonej wydajności' requestAnimationFrame'. –

Powiązane problemy