2014-10-14 11 views
10

ich einige Probleme, zu verstehen, wie die Scroll-Position des Fensters innerhalb meines Controller zu bekommen, so dass ich um ihn herum Logik bauen.Winkel- und immer Fenster Scrollposition in der Steuerung

Von allen Fragen und Antworten, die ich habe scheint die am meisten akzeptierte Antwort zu lesen zu sein, um eine Richtlinie zu schreiben, die die Bildlaufposition berechnet, bleiben diese Richtlinie auf ein Element, und das ist es.

Wenn Sie jedoch etwas entlang der Linien von tun:

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

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

Dieser Ansatz scheint nicht, zu arbeiten, weil die berechnete Position in der Richtlinie nicht von der Steuerung zugegriffen werden. Was wäre die richtige "Winkel" -Methode, um dies zu tun, was immer noch eine etwas kompliziertere Logik erlauben würde, die vom Controller ausgeführt wird?

+2

Binden Sie die Bereichsvariable des Controllers an den isolierten Bereich der Richtlinie und implementieren Sie die Logik im Controller der Anweisung. – Angad

+0

@ singh101 genau. – Linial

+0

@Angad, Linial, wäre es möglich, dies mit einem Beispiel zu veranschaulichen? Bitte? :) – Squrler

Antwort

11

Nach @RobKohr Kommentar, hier ist eine optimierte Ansatz .on('scroll') und $scope.$apply mit auf Scroll einen Umfang Element zu aktualisieren.

$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

Sie erhalten mehr Granularität in der Scroll-Position, da sie auf das native scroll-Ereignis reagiert, aber Sie werden den angularen Scope bei jedem feuern des Handlers mit "$ applying" durchkreuzen. Dies ist definitiv nicht optimiert. Sehen Sie sich stattdessen meinen Kommentar als Antwort auf RobKhor an: 'requestAnimationFrame' ist der richtige Weg. Vermeiden Sie es, das Oszilloskop um jeden Preis zu berühren! –

+0

Soweit ich mich erinnere, wurde ich an vielen Stellen meiner Website '$ scope.pixelsScrolled' benötigt und dies ermöglichte es mir, es wartbar zu machen, und ich hielt gute Leistungen für das, was ich gefragt habe. –

+0

Aber wenn irgendjemand Leistungsprobleme hat, kann er immer noch irgendeine Logik (wie RAF) anhängen, wo sich die 'console.log' auf meinem Snippet befindet. –

7

Injizieren Sie die $window Dienst in Ihrem Controller, die sich um den Browser window Objekt einfach ein Wrapper ist, und Sie haben die $window.scrollX und $window.scrollY Eigenschaften.

Wenn Sie Änderungen in Blättern zu reagieren, setzen Sie eine Uhr auf sie:

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

Das ist für mich nicht funktioniert hat. Verwenden von Angular 1.4.0. –

+1

Arbeitete für mich. Ein bisschen langsam aber. Es scheint nicht häufig zu aktualisieren – RobKohr

+0

@RobKohr Vereinbarte. Die Frage deutet darauf hin, dass bei der Änderung der Scroll-Position eine Scope-Variable gesetzt wird, so dass ein "$ scope. $ Watch" am sinnvollsten ist, aber ich hätte auch erwähnen sollen, dass 'requestAnimationFrame' für solche Paint-Operationen verwendet werden sollte. In diesem Fall sollten alle Änderungen an Scope-Variablen in eine $ scope. $ Apply-Funktion eingeschlossen werden oder sie werden nicht von Angular übernommen - eine kleine Unannehmlichkeit für die gesteigerte Effizienz von 'requestAnimationFrame'. –

Verwandte Themen