【发布时间】:2020-05-03 03:32:30
【问题描述】:
IonContent 有自己的滚动事件,我需要在子组件中监听它。
我正在监听没有触发的窗口滚动事件,我意识到它被包裹在处理自己的滚动事件的 IonContent 元素中。
下面是我的布局示例
<ion-content scrollEvents={ true } onIonScroll={ this.windowScrolled.bind(this) }>
<bf-filter-selections scrollElement={this.ionContent} ref={(e) => this.filterElementWrapper = e}></bf-filter-selections>
</ion-content>
我尝试了一些方法:
- 我尝试从 发生 IonContent 滚动时的父级
- 我尝试将父级的引用传递给子级,这样我就可以 监听滚动事件
- 我尝试在子节点上创建一个属性,当 滚动事件发生,然后观察变化
这可能会回到我缺乏的一些基本 js 知识,但令人沮丧的是,当内容滚动时,我似乎无法在子组件中触发事件。
在我尝试过的所有方法中,这就是它们不起作用的原因
1) 从父组件调用子组件的方法,代码告诉我在子组件上找不到“windowScroll”。
filterElementWrapper 是 HTMLElement
filterElementWrapper: any;
windowScrolled(e: any) {
this.filterElementWrapper.windowScroll();
}
子组件方法
@Listen('onscroll')
@Watch('scrollOffset')
public windowScroll() {
console.log('scroll');
if (window.pageYOffset > this.resultHeaderElementOffset) {
this.resultHeaderElement.classList.add("sticky");
} else {
this.resultHeaderElement.classList.remove("sticky");
}
}
2) 尝试将父组件的引用传递给子组件
我不再有支持这一点的代码,但基本上在子组件中,我创建了一个类型为“any”的属性并将父级的引用传递给子级。
然后我创建了一个“Listen('ionScroll', { target: this.scrollElement})”。
该方法永远不会在子级中触发。
3) 在子组件上创建了一个名为“scrollOffset”的属性。我在触发滚动时更新了此属性,并“监视”子组件中的属性更改。同样,该方法没有触发。
设置滚动偏移属性的主包装器
<ion-content scrollEvents={ true } onIonScroll={ this.windowScrolled.bind(this) }>
<bf-filter-selections scroll-offset={this.scrollTop} scrollElement={this.ionContent} ref={(e) => this.filterElementWrapper = e}></bf-filter-selections>
</ion-content>
父级中设置的状态属性
@State() scrollTop: number = 0;
在滚动时更新 state 属性
windowScrolled(e: any) {
this.scrollTop = e.detail.currentY;
}
被监视的子属性
@Prop() scrollOffset: number;
观察属性变化的方法
@Listen('onscroll')
@Watch('scrollOffset')
public windowScroll() {
console.log('scroll');
if (window.pageYOffset > this.resultHeaderElementOffset) {
this.resultHeaderElement.classList.add("sticky");
} else {
this.resultHeaderElement.classList.remove("sticky");
}
}
在所有情况下,都没有调用该方法。
【问题讨论】:
-
也许您可以分享更多信息为什么您的解决方案不起作用,也许还可以提供更多代码 sn-ps 以真正了解您到目前为止所做的工作。
-
@ChristianMeyer - 我添加了一些我尝试过的示例。感谢您的反馈
标签: javascript ionic-framework ionic4 jsx stenciljs