2014-10-14 4 views
10

Ho difficoltà a capire come ottenere la posizione di scorrimento della finestra all'interno del mio controller, così posso creare la logica attorno ad esso.Angolare e ottenere la posizione di scorrimento della finestra nel controllore

Da tutte le domande e risposte che ho letto, la risposta più accettata sembra essere quella di scrivere una direttiva che calcola la posizione di scorrimento, applicare quella direttiva a un elemento e il gioco è fatto.

Tuttavia, quando si vuole fare qualcosa sulla falsariga di:

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

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

Questo approccio non sembra funzionare, perché la posizione calcolata dalla direttiva non è possibile accedere dal controller. Quale sarebbe il giusto modo 'Angolare' per farlo, che consentirebbe comunque l'esecuzione di una logica leggermente più complicata dal controller?

+2

Associare la variabile scope del controller all'ambito isolato della direttiva e implementare la logica nel controller della direttiva. – Angad

+0

@ singh101 esattamente. – Linial

+0

@Angad, Linial, sarebbe possibile illustrarlo con un esempio? Per favore? :) – Squrler

risposta

11

Secondo commento @RobKohr, ecco un approccio ottimizzato utilizzando .on('scroll') e $scope.$apply per aggiornare un elemento ambito sul rotolo.

$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

Riceverai più granularità sulla posizione di scorrimento perché risponde all'evento di scorrimento nativo, ma stai andando a colpire l'ambito angolare applicando $ applicando ogni volta che il gestore attiva. Questo non è sicuramente ottimizzato. Invece fai riferimento al mio commento in risposta a RobKhor: 'requestAnimationFrame' è la strada da percorrere. Evitare di toccare l'ambito a tutti i costi! –

+0

Per quanto mi ricordo, avevo bisogno di '$ scope.pixelsScrolled' in molti posti del mio sito web e questo mi ha permesso di renderlo mantenibile e ho mantenuto buone prestazioni per quello che ho chiesto. –

+0

Ma se qualcuno ha problemi di prestazioni, può comunque collegare qualsiasi logica (come RAF) in cui 'console.log' si trova nel mio frammento. –

7

Iniettare il servizio $window nel controller, che è semplicemente un wrapper per l'oggetto browser window, e si hanno le proprietà $window.scrollX e $window.scrollY.

Se si vuole rispondere ai cambiamenti di scorrimento, mettere un orologio su di loro:

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

Questo non ha funzionato per me. Utilizzando Angular 1.4.0. –

+1

ha funzionato per me. Un po 'lento però. Non sembra aggiornato frequentemente – RobKohr

+0

@RobKohr Concordato. La domanda suggerisce di impostare una variabile scope quando cambia la posizione di scorrimento, quindi un '$ scope. $ Watch' ha più senso, ma avrei dovuto anche dire che' requestAnimationFrame' dovrebbe essere usato per operazioni di pittura come questa. In tal caso, eventuali modifiche alle variabili di ambito devono essere racchiuse all'interno di una funzione $ $ scope. $ Apply, o non verranno rilevate da Angular - un piccolo inconveniente per la maggiore efficienza di 'requestAnimationFrame'. –