Questo è un classico. Hai un elemento genitore e un elemento figlio. L'elemento figlio è posizionato in modo assoluto e si desidera che l'utente scorra il suo contenuto. Tuttavia, quando si raggiunge la parte inferiore dell'elemento figlio, l'elemento padre (a cui è consentito anche avere barre di scorrimento) inizia a scorrere. Questo è indesiderabile. Il comportamento di base che voglio riprodurre è quello della sezione commenti del New York Times. Per example:Previene lo scorrimento dell'elemento figlio da propagare in Angular 2
Il corpo è consentito di scorrere verso il basso, ma quando si è in fondo la sezione dei commenti, scorrendo verso il basso non fa nulla. Penso che la differenza principale in questo caso sia che voglio far scorrere l'utente verso il basso quando il cursore è posizionato sopra l'elemento del corpo. Altri approcci richiedono di aggiungere una classe al corpo per prevenire qualsiasi evento di scorrimento nel corpo. Ho pensato di essere in grado di fare questo con un po 'di Javascript nel Angolare 2, ma questo è il mio tentativo è fallito finora:
Ho una direttiva personalizzato nel mio componente figlio:
<child-element scroller class="child"></child-element>
e della presente direttiva dovrebbe fermare la propagazione della manifestazione di scorrimento per l'elemento del corpo:
import {Component} from 'angular2/core'
import {Directive, ElementRef, Renderer} from 'angular2/core';
@Directive({
selector: '[scroller]',
})
export class ScrollerDirective {
constructor(private elRef: ElementRef, private renderer: Renderer) {
renderer.listen(elRef.nativeElement, 'scroll', (event) => {
console.log('event!');
event.stopPropagation();
event.preventDefault();
})
}
}
In realtà ascolta l'evento ma non interrompe la propagazione.
Demo: scorrere verso il basso nell'elenco dei numeri e quando si raggiunge il fondo, l'elemento padre inizia a scorrere verso il basso. Questo è il problema.
Se si dispone di un altro approccio per realizzare questo, per favore fatemelo sapere.
Grazie
UPDATE: Sulla base della risposta fornita da Günter Zöchbauer, sto cercando di impedire l'evento ruota quando l'utente raggiunge il fondo. Questo è fondamentalmente ciò che ho finora in questo updated demo:
renderer.listen(elRef.nativeElement, 'wheel', (e) => {
console.log('event', e);
console.log('scrollTop', elRef.nativeElement.scrollTop);
console.log('lastScrollTop', lastScrollTop);
if (elRef.nativeElement.scrollTop == lastScrollTop && e.deltaY > 0) {
e = e || window.event;
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
}
else if (elRef.nativeElement.scrollTop == 0) {
lastScrollTop = -1;
}
else {
lastScrollTop = elRef.nativeElement.scrollTop;
}
}, false)
Tuttavia, la logica è brutto e non funziona grande. Ad esempio, quando l'utente raggiunge il fondo, scorre leggermente verso l'alto e scorre nuovamente verso il basso, il componente principale si sposta leggermente. Qualcuno sa come affrontare questo? Un'implementazione (molto) migliore?
UPDATE 2:
This è molto meglio, ma è tardi, quindi mi controllerà di nuovo domani.
Grazie. Molto interessante.Sto solo cercando di capire come usare l'evento wheel per evitare lo scrolling. Suppongo di dover rilevare quando l'utente ha spostato verso il basso ma non vedo un valore sull'oggetto evento per farlo. –
Vedere http://stackoverflow.com/questions/36468318/tracking-scroll-position-and-notifying-other-components-about-it-angular2/36468377?noredirect=1#comment60554485_36468377 e http://stackoverflow.com/ domande/36471927/eventemitter-non-lavoro-su-chrome-safari - in particolare l'ultimo commento sulla risposta. –
Penso di avere qualcosa che funzioni, ma sto lottando con la logica corretta. Aggiornerò la mia domanda –