Я хочу добавить несколько ссылок на мою страницу Angular2, которые при нажатии будут переходить на определенные позиции на этой странице, как это делают обычные хэштеги. Таким образом, ссылки будут примерно такими:
/users/123#userInfo
/users/123#userPhoto
/users/123#userLikes
и т.п.
Я не думаю, что мне нужен HashLocationStrategy, поскольку меня устраивает обычный способ Angular2, но если я добавлю напрямую, ссылка фактически перейдет в корень, а не где-то на той же странице. Любое направление приветствуется, спасибо.
123
идет речь), предполагая, что путь маршрута ожидает такой параметр, как{ path: 'users/:id', ....}
01
или100
недействительные селекторы CSS. Возможно, вы захотите добавить букву или что-то еще, чтобы сделать его допустимым селектором. Таким образом, вы все равно будете проходить01
как фрагмент, ноid
должно быть что-то вродеd01
и, следовательно,document.querySelector('#d'+id)
будет соответствовать.Хотя ответ Гюнтера правильный, он не охватывает «переход к» части тега привязки .
Поэтому дополнительно к:
... в компоненте (родительском), где вам нужно "перейти к" поведению, добавьте:
Обратите внимание, что это обходной путь ! Следите за этой проблемой github для будущих обновлений. Благодарим Виктора Савкина за решение проблемы!
источник
"['../faq']"
качестве значения, иначе он попытается перейти к привязке / faq / faq / # вместе с привязкой / faq / #. Это правильный способ сделать это или есть более элегантный способ обратиться к текущей странице в routerlink? Кроме того,document.querySelector("#" + tree.fragment);
дает мне недопустимую ошибку селектора. Вы уверены, что это правильно? Спасибо<a [routerLink]="['/faq']" fragment="section6">
?Извините за то, что ответил немного поздно; В документации по маршрутизации Angular есть предопределенная функция, которая помогает нам в маршрутизации с помощью хэштега для привязки к странице, то есть anchorScrolling: 'enabled'
Шаг 1: - Сначала импортируйте RouterModule в файл app.module.ts: -
Шаг 2: - Перейдите на HTML-страницу, создайте навигацию и добавьте два важных атрибута, таких как [routerLink] и фрагмент, для сопоставления соответствующих идентификаторов Div ID : -
Шаг 3: - Создайте раздел / div, сопоставив имя идентификатора с фрагментом : -
Для справки я добавил приведенный ниже пример, создав небольшую демонстрацию, которая помогает решить вашу проблему.
источник
scrollPositionRestoration: 'enabled',
опцию anchorScrolling :)Немного поздно, но вот ответ, который я нашел, работает:
И в компоненте:
Вышеупомянутое автоматически не прокручивается до представления, если вы уже попадаете на страницу с привязкой, поэтому я использовал решение выше в моем ngInit, чтобы оно могло работать и с этим:
Обязательно импортируйте Router, ActivatedRoute и NavigationEnd в начало вашего компонента, и все должно быть в порядке.
Источник
источник
document.querySelector ( "#" + f )
дает мне ошибку, потому что ожидает селектор, а не строку.element.scrollIntoView()
(без переходаelement
к функции). Для того, чтобы сделать ее гладкой, используйте это:element.scrollIntoView({block: "end", behavior: "smooth"})
.onAnchorClick()
, мы должны пройти булевы к scrollIntoView:if (element) { element.scrollIntoView(true); }
. Теперь я могу дважды щелкнуть по той же ссылке и пролистать работыНи один из предыдущих ответов не помог мне. Из последних сил я попробовал в своем шаблоне:
С этим в моем .ts:
И это работает, как ожидалось, для внутренних ссылок. При этом фактически не используются теги привязки, поэтому URL-адрес вообще не затрагивается.
источник
Вышеупомянутые решения не помогли мне ... Вот этот:
Во-первых, подготовьтесь
MyAppComponent
к автоматической прокрутке в ngAfterViewChecked () ...Затем перейдите к
my-app-route
отправкеprodID
хэштегаисточник
Все остальные ответы будут работать на Angular версии <6.1. Но если у вас последняя версия, вам не нужно делать эти уродливые хаки, поскольку Angular устранил проблему.
вот ссылка на выпуск
Все, что вам нужно сделать, это установить
scrollOffset
с помощью второго аргументаRouterModule.forRoot
метода.источник
Используйте это для модуля маршрутизатора в
app-routing.module.ts
:Это будет в вашем HTML:
источник
В html файле:
В файле ts:
источник
Поскольку свойство фрагмента по-прежнему не обеспечивает прокрутку привязки, этот обходной путь помог мне:
источник
Добавление к Kalyoyan в ответ , эта подписка привязана к маршрутизатору , и будет жить до тех пор , пока страница полностью обновлена. При подписке на события маршрутизатора в компоненте обязательно отмените подписку в ngOnDestroy:
источник
Я только что заставил это работать на моем собственном веб-сайте, поэтому я подумал, что стоит опубликовать свое решение здесь.
А затем в свой компонент убедитесь, что вы включили это:
источник
element.scrollIntoView()
илиelement.scrollIntoView(true)
. Ваша версия у меня не компилировалась (может быть, из-за strictNullChecks?).Прочитав все решения, я поискал компонент и нашел тот, который выполняет именно то, о чем просил исходный вопрос: прокручивается до якорных ссылок. https://www.npmjs.com/package/ng2-scroll-to
При его установке вы используете такой синтаксис:
У меня это сработало очень хорошо.
источник
Простое решение, которое работает для страниц без каких-либо параметров запроса, совместимо с браузером вперед / назад, маршрутизатором и глубокими ссылками.
Тайм-аут просто позволяет странице загружать любые динамические данные, "защищенные" * ngIf. Это также можно использовать для прокрутки вверх страницы при изменении маршрута - просто укажите тег привязки по умолчанию.
источник
если не имеет значения добавление этих идентификаторов элементов к URL-адресу, вам следует рассмотреть возможность взглянуть на эту ссылку:
Angular 2 - привязка ссылок к элементу на текущей странице
источник
Вот еще один обходной путь со ссылкой на ответ JavierFuentes:
в скрипте:
Это позволяет пользователю напрямую прокручивать элемент, если пользователь напрямую попадает на страницу с хэштегом в URL-адресе.
Но в этом случае я подписал фрагмент маршрута,
ngAfterViewChecked
ноngAfterViewChecked()
ngDoCheck
он вызывается постоянно для каждого, и это не позволяет пользователю прокручивать назад вверх, поэтомуrouteFragmentSubscription.unsubscribe
вызывается после тайм-аута 0 миллисекунд после прокрутки просмотра до элемента.Дополнительно
gotoHashtag
определен метод для прокрутки к элементу, когда пользователь специально щелкает тег привязки.Обновить:
Если URL-адрес содержит строки запроса,
[routerLink]="['self-route', id]"
в привязке строки запроса не сохранятся. Я пробовал следующее обходное решение для того же:источник
Эта работа для меня !! Этот ngFor, чтобы он динамически привязал тег, вам нужно дождаться их рендеринга
HTML:
Мой ts файл:
Не забудьте импортировать это
ViewChildren
иQueryList
т.д. и добавить конструкторActivatedRoute
!!источник
В отличие от других ответов , которые я бы дополнительно добавить
focus()
вместе сscrollIntoView()
. Также я использую,setTimeout
так как в противном случае при изменении URL-адреса он перескакивает вверх. Не уверен, что было причиной этого, но, похоже,setTimeout
есть обходной путь.Происхождение:
Место назначения:
Машинопись:
источник
Я была такая же проблема. Решение: используя View port Scroller https://angular.io/api/common/ViewportScroller#scrolltoanchor
- код app-routing.module.ts:
- Компонент HTML
- Код компонента:
источник
Я только что протестировал очень полезный плагин, доступный в nmp - ngx-scroll-to , который мне отлично подходит . Однако он разработан для Angular 4+, но, возможно, кто-то найдет этот ответ полезным.
источник
Я пробовал большинство из этих решений, но столкнулся с проблемами, когда уходил и возвращался с другим фрагментом, это не сработало, поэтому я сделал что-то немного другое, которое работает на 100% и избавляется от уродливого хеша в URL-адресе.
tl; dr вот способ получше, чем то, что я видел до сих пор.
источник