【发布时间】:2017-06-18 01:48:30
【问题描述】:
我正在使用一个简单的链接导航到另一个页面,使用 HashLocationStrategy :
<a href="/#/mypage">My Page</a></div>
点击上面的链接后,mypage 正在加载,但由于我向下滚动上一页,它被加载到页面中间(与上一页相同的滚动位置)。
我确实有一个解决方法,但为什么会发生这种情况?
【问题讨论】:
我正在使用一个简单的链接导航到另一个页面,使用 HashLocationStrategy :
<a href="/#/mypage">My Page</a></div>
点击上面的链接后,mypage 正在加载,但由于我向下滚动上一页,它被加载到页面中间(与上一页相同的滚动位置)。
我确实有一个解决方法,但为什么会发生这种情况?
【问题讨论】:
我确实有一个解决方法,但为什么会发生这种情况?
它发生的原因之一,或者更好地说:它没有发生,因为 Angular2 路由器可用于在给定的插座内导航。您可以拥有多个named router outlets(或页面下方的某个位置),并且在导航其中任何一个后将页面滚动到顶部会破坏该行为。正如我们所见,添加滚动功能并不是很难自己实现。也值得一读:Named router outlets in Angular2
【讨论】:
一种解决方法是在目标页面上定义:
@Component({
...
})
export class MyPageComponent {
ngAfterViewInit() {
window.scrollTo(0, 0);
}
}
【讨论】:
这是因为 Angular 阻止了链接点击事件的默认操作,因此页面不会滚动到顶部。
作为一种解决方法,只需订阅router.events 并过滤掉 NavigationEnd 事件:
this.router.events.subscribe(event => {
if(event instance of NavigationEnd) {
... scroll to top
}
}
【讨论】:
发生这种情况是因为没有实际的页面刷新。尚无关于如何在不使用解决方法的情况下触发此操作的实现。我想主要问题是你可以在同一个屏幕上拥有多个router-outlet,并且在某些情况下它不应该向上滚动。
在我的AppComponent 中,我使用了这个解决方法。您可能使用相同的:
constructor(private _router: Router) {}
ngOnInit() {
this._router.events.subscribe((event: NavigationEnd) => {
if(event instanceof NavigationEnd) {
window.scrollTo(0, 0);
}
})
}
【讨论】: