這是一個經典。你有一個父母和一個孩子的元素。子元素絕對定位,您希望用戶滾動瀏覽其內容。但是,當您到達子元素的底部時,父元素(也允許具有滾動條)開始滾動。這是不可取的。我想重現的基本行爲是紐約時報的評論部分。對於example:防止在Angular 2中傳播子元素的滾動
身體允許向下滾動,但是當你在註釋部分的底部,向下滾動不會做任何事情。我認爲這種情況的主要區別在於我想讓用戶在光標位於body元素上時向下滾動。其他方法需要向主體添加一個類來防止正文中的任何滾動事件。我想我能在角2位JavaScript來做到這一點,但是這是我的失敗嘗試至今:
:
我在我的孩子部件有一個自定義指令<child-element scroller class="child"></child-element>
和此指令是應該停止滾動事件到主體元件的傳播:
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();
})
}
}
它實際上監聽事件,但它不會停止傳播。
Demo:向下滾動數字列表,當您到達底部時,其父元素開始向下滾動。那就是問題所在。
如果您有其他方法來完成此操作,請讓我知道。
感謝
UPDATE:基於由君特Zöchbauer提供的答案,我試圖防止車輪事件,當用戶到達底部。這基本上就是我在這個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)
然而,邏輯是醜陋和不工作的偉大。例如,當用戶到達底部時,向上滾動一下並再次向下滾動,父組件稍微移動。有誰知道如何處理這個? (更好)更好的實現?
更新2:
This是好多了,但已經晚了,所以我會再次檢查的明天。
謝謝。很有意思。我只是想弄清楚如何使用輪子事件來防止滾動。我想我需要檢測用戶何時滾動到底部,但我沒有看到事件對象上的值來做到這一點。 –
請參閱http://stackoverflow.com/questions/36468318/tracking-scroll-position-and-notifying-other-components-about-it-angular2/36468377?noredirect=1#comment60554485_36468377和http://stackoverflow.com/問題/ 36471927/eventemitter-does-not-work-on-chrome-safari - 尤其是對答案的最後評論。 –
我想我有一些工作,但我正在努力正確的邏輯。我會更新我的問題。 –