Можно ли использовать привязные ссылки с Angularjs?
то есть:.
<a href="#top">Top</a>
<a href="#middle">Middle</a>
<a href="#bottom">Bottom</a>
<div name="top"></div>
...
<div name="middle"></div>
...
<div name="bottom"></div>
Спасибо
Можно ли использовать привязные ссылки с Angularjs?
то есть:.
<a href="#top">Top</a>
<a href="#middle">Middle</a>
<a href="#bottom">Bottom</a>
<div name="top"></div>
...
<div name="middle"></div>
...
<div name="bottom"></div>
Спасибо
Есть несколько способов сделать это.
Angular предоставляет службу $anchorScroll
, но документация сильно отсутствует, и я не смог заставить ее работать.
Ознакомьтесь с http://www.benlesh.com/2013/02/angular-js-scrolling-to-element-by-id.html, чтобы узнать о $anchorScroll
.
Еще один способ, которым я тестировал, - создать пользовательскую директиву и использовать el.scrollIntoView()
.
Это работает довольно прилично, в основном делая следующее в вашей функции ссылки:
var el = document.getElementById(attrs.href);
el.scrollIntoView();
Однако, кажется, немного раздутый, чтобы сделать оба из них, когда браузер изначально поддерживает это, не так ли?
Если вы посмотрите на http://docs.angularjs.org/guide/dev_guide.services.$location и его раздел перезаписи HTML-ссылок, Посмотрим, что ссылки не переписаны в следующем:
Ссылки, содержащие целевой элемент
Пример:
<a href="/ext/link?a=b" target="_self">link</a>
Итак, все, что вам нужно сделать, это добавить атрибут target
к вашим ссылкам, например:
<a href="#anchorLinkID" target="_self">Go to inpage section</a>
Angular по умолчанию используется браузер, и, поскольку он связан с привязкой, а не с другим базовым URL-адресом, браузер прокручивается в нужное место по желанию.
Я пошел с вариантом 3, потому что лучше всего полагаться на встроенные функции браузера здесь и экономит время и силы.
Следует отметить, что после успешного изменения прокрутки и хэша Angular выполняет и переписывает хэш в свой собственный стиль. Тем не менее, браузер уже завершил свой бизнес, и вам хорошо идти.
Я не знаю, отвечает ли это на ваш вопрос, но да, вы можете использовать ссылки angularjs, например:
<a ng-href="http://www.gravatar.com/avatar/{{hash}}"/>
На веб-сайте AngularJS есть хороший пример:
http://docs.angularjs.org/api/ng.directive:ngHref
ОБНОВЛЕНИЕ: документация AngularJS была немного неясной, и она не обеспечила для нее хорошего решения. Сожалею!
Здесь вы можете найти лучшее решение: Как обрабатывать привязку привязки привязки в AngularJS
Вы можете попытаться использовать anchorScroll.
Таким образом, контроллер будет:
app.controller('MainCtrl', function($scope, $location, $anchorScroll, $routeParams) {
$scope.scrollTo = function(id) {
$location.hash(id);
$anchorScroll();
}
});
И представление:
<a href="" ng-click="scrollTo('foo')">Scroll to #foo</a>
... и не секрет для идентификатора привязки:
<div id="foo">
This is #foo
</div>
$anchorScroll действительно является ответом на это, но есть гораздо лучший способ использовать его в более поздних версиях Angular.
Теперь $anchorScroll принимает хеш в качестве необязательного аргумента, поэтому вам вообще не нужно менять $location.hash. (документация)
Это лучшее решение, потому что оно вообще не влияет на маршрут. Я не мог заставить работать какие-либо другие решения, потому что я использую ngRoute, и маршрут будет перезагружаться, как только я установлю $location.hash(id)
, прежде чем $anchorScroll сможет сделать свою магию.
Вот как его использовать... во-первых, в директиве или контроллере:
$scope.scrollTo = function (id) {
$anchorScroll(id);
}
а затем в представлении:
<a href="" ng-click="scrollTo(id)">Text</a>
Кроме того, если вам нужно учесть фиксированный navbar (или другой пользовательский интерфейс), вы можете установить смещение для $anchorScroll как это (в функции запуска основного модуля):
.run(function ($anchorScroll) {
//this will make anchorScroll scroll to the div minus 50px
$anchorScroll.yOffset = 50;
});
У меня была та же проблема, но это сработало для меня:
<a ng-href="javascript:void(0);#tagId"></a>
Работает для меня:
<a onclick='return false;' href="" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" ng-href="#profile#collapse{{$index}}"> blalba </a>
Или вы могли бы просто написать:
ng-href="\#yourAnchorId"
Обратите внимание на обратную косую черту перед символом хеша
Лучший выбор для меня - создать директиву для выполнения работы, потому что $location.hash()
и
$anchorScroll()
захватить URL-адрес, создавая множество проблем для моей маршрутизации SPA.
MyModule.directive('myAnchor', function() {
return {
restrict: 'A',
require: '?ngModel',
link: function(scope, elem, attrs, ngModel) {
return elem.bind('click', function() {
//other stuff ...
var el;
el = document.getElementById(attrs['myAnchor']);
return el.scrollIntoView();
});
}
};
});
Если вы используете SharePoint и angular, выполните следующие действия:
<a ng-href="{{item.LinkTo.Url}}" target="_blank" ng-bind="item.Title;" ></a>
где LinkTo и Title - столбцы SharePoint.
Вы также можете перейти к идентификатору HTML из внутреннего контроллера
$location.hash('id_in_html');
Вам нужно добавить только ссылку target = "_ self" на вашу ссылку
ех. <a href="#services" target="_self">Services</a>