Вот еще обходной путь с refernce к JavierFuentes ответ:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
в скрипте:
import {ActivatedRoute} from "@angular/router";
import {Subscription} from "rxjs/Subscription";
export class Links {
private scrollExecuted: boolean = false;
constructor(private route: ActivatedRoute) {}
ngAfterViewChecked() {
if (!this.scrollExecuted) {
let routeFragmentSubscription: Subscription;
routeFragmentSubscription = this.route.fragment.subscribe(fragment => {
if (fragment) {
let element = document.getElementById(fragment);
if (element) {
element.scrollIntoView();
this.scrollExecuted = true;
// Free resources
setTimeout(
() => {
console.log('routeFragmentSubscription unsubscribe');
routeFragmentSubscription.unsubscribe();
}, 0);
}
}
});
}
}
gotoHashtag(fragment: string) {
const element = document.querySelector("#" + fragment);
if (element) element.scrollIntoView(element);
}
}
Это позволяет пользователю непосредственно перейти к элементу, если пользователь непосредственно попадает на страницу, имеющей хэштегом в ссылке.
Но в этом случае, я подписался маршрут фрагмент в ngAfterViewChecked
но ngAfterViewChecked()
получает постоянно называют в каждом ngDoCheck
и это не позволяет пользователю прокручивать назад к вершине, так routeFragmentSubscription.unsubscribe
вызывается после тайм-аута 0 Millis после мнение прокручивается до элемента.
Кроме того, метод gotoHashtag
предназначен для прокрутки к элементу, когда пользователь специально нажимает на тег привязки.
Update:
Если URL имеет querystrings, [routerLink]="['self-route', id]"
анкер обыкновение сохранять querystrings. Я попытался следующий обходной путь для того же:
<a (click)="gotoHashtag('some-element')">Jump to Element</a>
constructor(private route: ActivatedRoute,
private _router:Router) {
}
...
...
gotoHashtag(fragment: string) {
let url = '';
let urlWithSegments = this._router.url.split('#');
if(urlWithSegments.length){
url = urlWithSegments[0];
}
window.location.hash = fragment;
const element = document.querySelector("#" + fragment);
if (element) element.scrollIntoView(element);
}
что означает 'id'? – invot
@invot переменная со строкой (например, вопрос «123» в вопросе), предполагая, что маршрут пути ожидает такой параметр, как «{path:« users /: id », ....}' –
Что делать, если я хотите, чтобы #anchor отображался только в том случае, если фрагмент не равен null/undefined? В настоящее время у меня все еще есть http://somethi.ng/page#. Если нет якоря, это должно быть просто http://somethi.ng/page. Если есть якорь, он все равно должен быть http://somethi.ng/page#anchor. – Kunepro