Кто-нибудь из вас знает, как правильно обрабатывать привязку хеш-ссылок в AngularJS ?
У меня есть следующая разметка для простой FAQ-страницы
<a href="#faq-1">Question 1</a>
<a href="#faq-2">Question 2</a>
<a href="#faq-3">Question 3</a>
<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="fa1-3">Question 3</h3>
При нажатии на любую из вышеуказанных ссылок AngularJS перехватывает и направляет меня на совершенно другую страницу (в моем случае это страница 404, так как нет маршрутов, соответствующих ссылкам).
Моей первой мыслью было создать сопоставление маршрута " / faq /: chapter " и в соответствующем контроллере проверить $routeParams.chapter
после соответствующего элемента, а затем использовать jQuery для прокрутки до него.
Но потом AngularJS снова на меня наваливается и все равно просто прокручивается вверх страницы.
Итак, кто-нибудь здесь делал что-то подобное в прошлом и знает хорошее решение для этого?
Изменить: Переход на html5Mode должен решить мои проблемы, но мы все равно должны поддерживать IE8 +, поэтому я боюсь, что это не является приемлемым решением: /
источник
ng-href=""
вместо.Ответы:
Ты ищешь
$anchorScroll()
.Вот (дерьмовая) документация.
И вот источник.
По сути, вы просто внедряете его и вызываете в контроллере, и он прокручивает вас до любого элемента с идентификатором
$location.hash()
Вот плункер, чтобы продемонстрировать
РЕДАКТИРОВАТЬ: использовать это с маршрутизацией
Настройте свою угловую маршрутизацию как обычно, затем просто добавьте следующий код.
и ваша ссылка будет выглядеть так:
Вот Plunker, демонстрирующий прокрутку с маршрутизацией и $ anchorScroll
И даже проще:
и ваша ссылка будет выглядеть так:
источник
<a href="#foo">foo</a>
. Мой пример кода должен был показать прокрутку до идентификатора на routechange.$location.search('scrollTo', null)
В моем случае я заметил, что логика маршрутизации включается, если я изменил
$location.hash()
. Следующий трюк сработал ..источник
$location.hash(my_id); $anchorScroll; $location.hash(null)
. Это предотвращает перезагрузку, и мне не нужно управлятьold
переменной.Нет необходимости изменять какую-либо маршрутизацию или что-либо еще просто использовать
target="_self"
при создании ссылокПример:
И используйте
id
атрибут в ваших HTML- элементах так:Нет необходимости использовать ## как указано / упомянуто в комментариях ;-)
источник
источник
Если вы всегда знаете маршрут, вы можете просто добавить привязку следующим образом:
где
route
текущий угловой маршрут иanchorID
соответствует<a id="anchorID">
где-то на страницеисточник
reloadOnSearch: false
этот маршрут в конфигурации маршрутов, angular не будет вызывать изменение маршрута и просто перейдет к идентификатору. В сочетании с полным маршрутом, указанным вa
теге, я бы сказал, что это самое простое и простое решение.$anchorScroll
работает для этого, но есть гораздо лучший способ использовать его в более поздних версиях Angular.Теперь,
$anchorScroll
принимаем хеш в качестве необязательного аргумента, поэтому вам не нужно ничего менять$location.hash
. ( документация )Это лучшее решение, потому что оно никак не влияет на маршрут. Я не смог заставить работать ни одно из других решений, потому что я использую ngRoute, и маршрут перезагружался, как только я установил
$location.hash(id)
, прежде чем$anchorScroll
мог сделать свое волшебство.Вот как это использовать ... во-первых, в директиве или контроллере:
а затем в представлении:
Кроме того, если вам нужно учитывать фиксированную панель навигации (или другой пользовательский интерфейс), вы можете установить смещение для $ anchorScroll следующим образом (в функции запуска основного модуля):
источник
id
в этом представлении.ngRoute
и более новую версию Angular.Это было мое решение с использованием директивы, которая кажется более Angular-y, потому что мы имеем дело с DOM:
Плнкр здесь
GitHub
КОД
HTML
Я использовал сервис $ anchorScroll. Чтобы противодействовать обновлению страницы, которое сопровождает изменение хеша, я пошел дальше и отменил событие locationChangeStart. Это сработало для меня, потому что у меня была страница справки, подключенная к ng-switch, и обновления по существу сломали приложение.
источник
Попробуй установить хеш-префикс для угловых маршрутов
$locationProvider.hashPrefix('!')
Полный пример:
источник
Я обошел это в логике маршрута для моего приложения.
источник
Это старый пост, но я потратил много времени на изучение различных решений, поэтому хотел поделиться еще одним простым. Просто добавление
target="_self"
в<a>
тег исправило это для меня. Ссылка работает и доставит меня в нужное место на странице.Тем не менее, Angular все еще вводит некоторую странность с # в URL, поэтому вы можете столкнуться с проблемами при использовании кнопки «Назад» для навигации и т. Д. После использования этого метода.
источник
Это может быть новый атрибут для ngView, но я смог заставить его привязывать хеш-ссылки для работы с
angular-route
использованиемngView autoscroll
атрибута и «двойных хешей».ngView (см. автопрокрутку)
(Следующий код был использован с угловым ремешком)
источник
Я мог бы сделать это так:
источник
Вот своего рода грязный обходной путь, создавая пользовательскую директиву, которая будет прокручивать до указанного элемента (с жестко закодированным «faq»)
http://plnkr.co/edit/Po37JFeP5IsNoz5ZycFs?p=preview
источник
$anchorScroll
, смотрите мой ответ.источник
Если вам не нравится использовать
ng-click
вот альтернативное решение. Он используетfilter
для создания правильного URL на основе текущего состояния. Мой пример использует ui.router .Преимущество заключается в том, что пользователь увидит, куда ведет ссылка.
Фильтр:
источник
Мое решение с ng-route было этой простой директивой:
HTML выглядит так:
источник
scroll-to="yourid"
и называть директивуscrollTo
(и обращаться к атрибуту какattrs["scrollTo"]
? Кроме того, без явного включения jQuery должен быть связан обработчикelement.on('click', function (e) {..})
.Вы можете попробовать использовать anchorScroll .
пример
Таким образом, контроллер будет:
И мнение:
... и не секрет для идентификатора якоря:
источник
Я пытался сделать мое приложение Угловое прокрутки к загрузке якорь OPON и побежал в URL переписывания правила $ routeProvider.
После долгих экспериментов я остановился на этом:
источник
Я не уверен на 100%, работает ли это все время, но в моем приложении это дает мне ожидаемое поведение.
Допустим, вы находитесь на странице ПРО, и у вас есть следующий маршрут:
Теперь в вас HTML
В заключение
Включение имени страницы до того, как якорь сделал свое дело для меня. Дайте мне знать о ваших мыслях.
нижняя сторона
Это будет повторно визуализировать страницу, а затем прокрутить до якоря.
ОБНОВИТЬ
Лучше добавить следующее:
источник
Получите вашу функцию прокрутки легко. Он также поддерживает анимированную / плавную прокрутку в качестве дополнительной функции. Детали для библиотеки Angular Scroll :
Github - https://github.com/oblador/angular-scroll
Бауэр :
bower install --save angular-scroll
нпм :
npm install --save angular-scroll
Minfied версия - всего 9kb
Плавная прокрутка (анимированная прокрутка) - да
Scroll Spy - да
Документация - отлично
Демо - http://oblador.github.io/angular-scroll/
Надеюсь это поможет.
источник
На основе @Stoyan я придумал следующее решение:
источник
При изменении маршрута он будет прокручиваться до верхней части страницы.
поместите этот код на свой контроллер.
источник
В моем представлении @slugslog было это, но я бы изменил одну вещь. Вместо этого я бы использовал замену, чтобы вам не пришлось устанавливать ее обратно.
Документы Поиск "Заменить метод"
источник
Ни одно из приведенных выше решений не работает для меня, но я просто попробовал это, и это сработало,
Таким образом, я понял, что мне нужно уведомить страницу, чтобы начать со страницы индекса, а затем использовать традиционную привязку.
источник
Иногда в Angularjs-приложении хэш-навигация не работает, и библиотеки начальной загрузки jquery javascript широко используют этот тип навигации, чтобы он работал и добавлялся
target="_self"
к тегу привязки. например<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">
источник
См. Https://code.angularjs.org/1.4.10/docs/api/ngRoute/provider/ $ routeProvider.
Установка этого в false сделала трюк без всего вышеперечисленного для меня.
источник
Я использую AngularJS 1.3.15 и похоже, что мне не нужно делать ничего особенного.
https://code.angularjs.org/1.3.15/docs/api/ng/provider/ $ anchorScrollProvider
Итак, в моем HTML работает следующее:
Мне не нужно было вносить какие-либо изменения в мой контроллер или JavaScript вообще.
источник