Angular 5锚没有滚动

时间:2018-02-22 09:36:01

标签: javascript angular

我要做的是创建一个锚链接。此链接将导航到我页面中的特定滚动点。我有Angular第5版。

HTML:

<mat-list>
     <mat-list-item><a [routerLink]="['/']"> Intro </a></mat-list-item>
     <mat-list-item><a [routerLink]="['/']" fragment="mobile"> Mobile </a></mat-list-item>     
     ...
</mat-list>

在home.componets.ts中:

export class HomeGrComponent implements OnInit {
    private fragment: string;

constructor(private route: ActivatedRoute) { }

ngOnInit() {        
    this.route.fragment.subscribe(fragment => { this.fragment = fragment; });
}

ngAfterViewInit(): void {
    try {
        setTimeout(()=> {
            document.querySelector('#' + this.fragment).scrollIntoView();
        }, 1000);

    } catch (e) { }
  }    
}

我从this question获取此代码,但它不起作用。网址已更改为

http://localhost:4200/#mobile

但它没有滚动到我的观点。 同样在控制台中有一个错误:

Cannot read property 'scrollIntoView' of null 

什么可能出错?如果您需要一些其他信息,请让我回复。滚动导航也很顺利(可选)。

3 个答案:

答案 0 :(得分:2)

您可以使用以下代码:

import { Component, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { filter } from 'rxjs/operators';
import { Subscription } from 'rxjs';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnDestroy {
  private sub: Subscription;

  constructor(activeRoute: ActivatedRoute) {
    this.sub = activeRoute.fragment.pipe(filter(f => !!f)).subscribe(f => document.getElementById(f).scrollIntoView());
  }

  public ngOnDestroy(): void {
    if(this.sub) this.sub.unsubscribe();
  }
}

工作exampleCode behind

答案 1 :(得分:1)

它无效的原因是ngAfterViewInitObservable被解析之前被调用,因此this.fragment为空,因此找不到元素

ngOnInit() {        
    this.route.fragment.subscribe(fragment => {
        this.fragment = fragment;
    });
}

ngAfterViewInit(): void {
    let interval = setInterval(()=> {
        let elem = document.getElementById(this.fragment);
        if(elem) {
            elem.scrollIntoView();
            clearInterval(interval);
        }
    }, 1000);  
}

答案 2 :(得分:0)

另一种选择是使用 setTimout()。因此,您不需要clearInterval()。 您还可以在 ActivatedRoute

的帮助下访问该片段
constructor(private route: ActivatedRoute) {}

ngAfterViewInit(): void {
           setTimeout(() => document.querySelector(this.route.snapshot.fragment).scrollIntoView(), 1000);
}