Angular 2中的自动滚动
Angular 2中的自动滚动
我在Angular 2中遇到一个问题,将路由从一个页面转到另一个页面时并没有自动滚动到新页面的顶部。我了解到Angular 1允许在HTML元素上添加一个autoscroll
属性,其他人也想出了一些简单的javascript(例如window.scroll(0, 0)
)来强制将页面滚动到顶部。
然而,我不确定如何在Angular 2中完成这个功能。有没有人知道如何实现这个
?
你可以在这里看到: https://angular.io/docs/ts/latest/api/router/index/Router-class.html#!#events-anchor,自Angular 2.0.0以来,必须使用"router.events.subscribe"。
因此,一个良好的自动滚动到页面顶部的解决方案是拥有一个像这样的AppComponent:
import {Component} from '@angular/core'; import {Router, NavigationEnd} from "@angular/router"; @Component({ selector: 'app-root', templateUrl: './app.component.html' }) export class AppComponent { constructor(private router: Router) { router.events.subscribe((val) => { if (val instanceof NavigationEnd){ window.scrollTo(0,0); } }); } }
更新
目前没有自动化的方法。
请参见Angular 2中使用subscribe函数在新路由器(rc 1)上的typescript错误
请参见https://github.com/angular/angular/issues/6595#issuecomment-244232725
class MyAppComponent { constructor(router: Router) { router.events.subscribe(s => { if (s instanceof NavigationEnd) { const tree = router.parseUrl(router.url); if (tree.fragment) { // you can use DomAdapter const element = document.querySelector("#" + tree.fragment); if (element) { element.scrollIntoView(element); } } } }); } }
更新
在新的路由器V3-beta.2中,您可以通过router links和router navigation传递片段
它应该会滚动到该位置,但也会将#top
添加到URL中(尚未进行测试)
更新
原始的
存在一个开放的问题https://github.com/angular/angular/issues/6595
一个解决方法(在https://github.com/angular/angular/issues/6946中提到)
注入路由器,订阅路由更改并调用向上滚动:
>= RC.x
router.changes.subscribe() => { window.scrollTo(0, 0); });
beta
router.events .filter(e => e instanceof NavigationEnd) .subscribe(() => { window.scrollTo(0, 0); });