ルートが変更されたときにangular 2サイトでページの一番上までスクロールしようとしています。 、ページは最初のページの位置までスクロールされます。
import { Component, OnInit } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
@Component({
selector: 'my-app',
template: '<ng-content></ng-content>',
})
export class MyAppComponent implements OnInit {
constructor(private router: Router) { }
ngOnInit() {
this.router.events.subscribe((evt) => {
if (!(evt instanceof NavigationEnd)) {
return;
}
window.scrollTo(0, 0)
});
}
}
私は何を間違えていますか?
新しいコンポーネントが_<router-outlet>
_にロードされると、ルーターはイベントを発行するため、イベントをアタッチできます。
コンポーネントで_<router-outlet>
_を使用する場合:
<router-outlet (activate)="scrollTop($event)">
次に、_<router-outlet>
_を配置した同じコンポーネントに、次のメソッドを追加します。
_scrollTop(event) {
window.scroll(0,0);
}
_
この似たような問題に直面したのは、体に適用されるスタイルが原因でした。つまり.
body {
height: 100%;
overflow-x: hidden;
}
このスタイルを削除すると、レイアウトに大きな影響が出ました。
スタイルを削除する代わりに、以下の解決策を試してみましたが、うまくいきました...
解決:
export class AppComponent implements OnInit {
constructor(private router: Router, private changeDetect: ChangeDetectorRef) {
}
ngOnInit() {
this.router.events.subscribe((evt) => {
if (!(evt instanceof NavigationEnd)) {
return;
}
// Change height:100% into auto
$('body').css('height', 'auto');
// Successfully scroll back to top
$('body').scrollTop(0);
// Remove javascript added styles
$('body').css('height', '');
this.changeDetect.detectChanges();
});
}
}
constructor(
private router: Router,
private ngZone: NgZone) {
router.events.subscribe((event: RouterEvent) => {
this._navigationInterceptor(event);
});
}
private _navigationInterceptor(event: RouterEvent): void {
if (event instanceof NavigationStart) {
}
if (event instanceof NavigationEnd) {
window.scrollTo({
top: 0
});
// or, window.scroll(0,0);
}
}
コンポーネントが初期化されるのを待ってから、スクロールを開始してください。したがって、このコードをngAfterViewInit
関数の下に置く方が適切です。
ngAfterViewInit() {
this.router.events.subscribe((evt) => {
if (!(evt instanceof NavigationEnd)) {
return;
}
window.scrollTo(0, 0)
});
}
このソリューションは私のプロジェクトで完璧に機能します:
export class AppComponent {
constructor (
private _router: Router,
) {
this._subscribeRouteEvents();
}
private _subscribeRouteEvents (): void {
this._router.events.subscribe(e => {
if (!(e instanceof NavigationEnd)) return;
window.scrollTo(0, 0);
});
}
}