Помогает ли AngularJS каким-либо образом active
класс для ссылки на текущую страницу?
Я предполагаю, что есть какой-то волшебный способ сделать это, но я не могу найти.
Мое меню выглядит так:
<ul>
<li><a class="active" href="/tasks">Tasks</a>
<li><a href="/actions">Tasks</a>
</ul>
и у меня есть контроллеры для каждого из них в моих маршрутах: TasksController
и ActionsController
.
Но я не могу придумать, как связать «активный» класс с a
ссылками на контроллеры.
Есть намеки?
ngClass="{active: isActive('/tasks')}
, гдеisActive()
будет возвращаться логическое значение, поскольку оно разъединяет контроллер и разметку / стиль.Я предлагаю использовать директиву по ссылке.
Но это еще не идеально. Остерегайтесь hashbangs;)
Вот javascript для директивы:
и вот как это будет использоваться в HTML:
потом стиль с помощью CSS:
источник
var path = $(element).children("a")[0].hash.substring(1);
. Это будет работать для стиля, как<li active-link="active"><a href="#/dashboard">Dashboard</a></li>
scope.$watch('location.path()', function(newPath) {
наscope.$on('$locationChangeStart', function(){
.var path = attrs.href;
наvar path = attrs.href||attrs.ngHref;
<li>
, вы можете изменить егоelement.addClass(clazz);
наelement.parent().addClass(clazz);
Вот простой подход, который хорошо работает с Angular.
В вашем контроллере AngularJS:
Эта тема имеет ряд других похожих ответов.
Как установить загрузочный класс Navbar с Angular JS?
источник
return viewLocation === $location.path()
Просто чтобы добавить два цента в дебаты, я сделал чисто угловой модуль (без jQuery), и он также будет работать с хеш-адресами, содержащими данные. (например
#/this/is/path?this=is&some=data
)Вы просто добавляете модуль в качестве зависимости и
auto-active
к одному из предков меню. Как это:И модуль выглядит так:
(Конечно, вы можете просто использовать директивную часть)
Также стоит заметить, что это не работает для пустых хешей (например,
example.com/#
или простоexample.com
), которые должны быть хотя быexample.com/#/
или простоexample.com#/
. Но это происходит автоматически с ngResource и т.п.А вот и скрипка: http://jsfiddle.net/gy2an/8/
источник
В моем случае я решил эту проблему, создав простой контроллер, отвечающий за навигацию
И просто добавив ng-класс к элементу, вот так:
источник
Для пользователей AngularUI Router:
И это поместит
active
класс на выбранный объект.источник
Eсть
ng-class
директива, которая связывает переменную и класс css. Он также принимает объект (className против пар значения bool).Вот пример, http://plnkr.co/edit/SWZAqj
источник
/test1/blahblah
или не так ли?active: activePath=='/test1'
автоматически возвращает «активный» путь начинается с заданной строки? Это какой-то предопределенный оператор или регулярное выражение?==
проверок в html.ответ от @ Ренан-tomal-Фернандеса это хорошо, но нужно несколько улучшений работы правильно. Как бы то ни было, он всегда будет обнаруживать ссылку на домашнюю страницу (/) как активированную, даже если вы находитесь в другом разделе.
Так что я немного его улучшил, вот код. Я работаю с Bootstrap, поэтому активная часть находится в
<li>
элементе вместо<a>
.контроллер
шаблон
источник
Вот решение, которое я придумала после прочтения некоторых из превосходных предложений выше. В моей конкретной ситуации я пытался использовать компонент вкладок Bootstrap в качестве моего меню, но не хотел использовать его версию Angular-UI, потому что я хочу, чтобы вкладки действовали как меню, где каждая вкладка имеет возможность закладки, а не вкладки, выступающие в качестве навигации для одной страницы. (См. Http://angular-ui.github.io/bootstrap/#/tabs, если вам интересно, как выглядит версия загрузочных вкладок Angular-UI).
Мне очень понравился ответ kfis о создании вашей собственной директивы, чтобы справиться с этим, однако было неудобно иметь директиву, которую нужно было разместить в каждой отдельной ссылке. Поэтому я создал свою собственную директиву Angular, которая вместо этого помещается однажды в
ul
. На случай, если кто-то еще попытается сделать то же самое, я решил опубликовать это здесь, хотя, как я уже сказал, многие из вышеперечисленных решений также работают. Это немного более сложное решение с точки зрения javascript, но оно создает повторно используемый компонент с минимальной разметкой.Вот javascript для директивы и провайдера маршрутов для
ng:view
:Тогда в вашем html вы просто:
Вот плункер для этого: http://plnkr.co/edit/xwGtGqrT7kWoCKnGDHYN?p=preview .
источник
Вы можете реализовать это очень просто, вот пример:
И ваш контроллер должен быть таким:
источник
используйте директиву angular-ui-router ui-sref-active https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statename
источник
У меня была похожая проблема с меню, расположенным вне области контроллера. Не уверен, что это лучшее решение или рекомендуемое, но это то, что сработало для меня. Я добавил следующее в конфигурацию своего приложения:
Тогда по моему мнению:
источник
Использование Angular версии 6 с Bootstrap 4.1
Я смог сделать это, как показано ниже.
В приведенном ниже примере, когда в URL-адресе отображается «/ contact», активная начальная загрузка добавляется в тег html. Когда URL-адрес изменяется, он удаляется.
Узнайте больше на сайте Angular
источник
Используя директиву (поскольку мы здесь выполняем манипуляции с DOM), следующее, вероятно, ближе всего подходит к «угловому пути»:
Тогда ваш HTML будет выглядеть так:
источник
menu-item
кажется избыточным в каждой строке. Возможно, лучше было бы прикрепить атрибут кul
элементу (например<ul menu>
), но я не уверен, возможно ли это.Я сделал это так:
Это позволяет вам иметь ссылки в разделе, который имеет директиву track-active:
Этот подход кажется мне намного чище, чем другие.
Кроме того, если вы используете jQuery, вы можете сделать его намного лучше, потому что jQlite имеет только базовую поддержку селектора. Гораздо более чистая версия с включенным jquery перед угловым включением будет выглядеть так:
Вот jsFiddle
источник
Мое решение этой проблемы используйте
route.current
в угловом шаблоне.Поскольку у вас есть
/tasks
маршрут для выделения в вашем меню, вы можете добавить свое собственное свойствоmenuItem
к маршрутам, объявленным вашим модулем:Тогда в вашем шаблоне
tasks.html
вы можете использовать следующуюng-class
директиву:На мой взгляд, это намного чище, чем все предлагаемые решения.
источник
Вот расширение директивы kfis, которое я сделал, чтобы учесть разные уровни соответствия пути. По сути, я обнаружил необходимость сопоставления URL-путей до определенной глубины, поскольку точное сопоставление не допускает вложений и перенаправлений состояний по умолчанию. Надеюсь это поможет.
А вот как я использую ссылку
Эта директива будет соответствовать уровню глубины, указанному в значении атрибута для директивы. Просто означает, что это может быть использовано в другом месте много раз.
источник
Вот еще одна директива для выделения активных ссылок.
Ключевая особенность:
Код:
Использование:
Простой пример с угловым выражением, скажем, $ scope.var = 2 , тогда ссылка будет активной, если location это / url / 2 :
Пример начальной загрузки, родительский ли получит активный класс:
Пример с вложенными URL, ссылка будет активной, если активен любой вложенный URL (т.е. / url / 1 , / url / 2 , url / 1/2 / ... )
Сложный пример, ссылка указывает на один URL ( / url1 ), но будет активна, если выбран другой ( / url2 ):
Пример с отключенной ссылкой, если она не активна, у нее будет класс «отключен» :
Все атрибуты active-link- * могут использоваться в любой комбинации, поэтому могут быть реализованы очень сложные условия.
источник
Если вам нужны ссылки для директивы в оболочке, а не для выбора каждой отдельной ссылки (это упрощает просмотр области действия в Batarang), это тоже работает довольно хорошо:
Разметка будет просто:
Я должен также упомянуть, что в этом примере я использую jQuery «полный жир», но вы можете легко изменить то, что я сделал с фильтрацией и так далее.
источник
Вот мои два цента, это прекрасно работает.
ПРИМЕЧАНИЕ: это не соответствует дочерним страницам (что мне и нужно).
Посмотреть:
контроллер:
источник
Согласно ответу @kfis, это комментарии, и я рекомендую окончательную директиву, как показано ниже:
источник
Для тех, кто использует ui-router, мой ответ несколько похож на Ender2050, но я предпочитаю делать это с помощью проверки имени состояния:
соответствующий HTML:
источник
Ни один из перечисленных выше директив предложений не были полезны для меня. Если у вас есть загрузчик Navbar, как это
(это может быть
$ yo angular
запуск), затем вы хотите добавить.active
в список классов родительского<li>
элемента, а не сам элемент; то есть<li class="active">..</li>
. Итак, я написал это:использование
set-parent-active
;.active
по умолчанию, поэтому не нужно устанавливатьи родительский
<li>
элемент будет,.active
когда ссылка активна. Чтобы использовать альтернативный.active
класс, как.highlight
, простоисточник
Самым важным для меня было вообще не менять код начальной загрузки. Вот мой контроллер меню, который ищет пункты меню и затем добавляет желаемое поведение.
источник
была такая же проблема. Вот мое решение :
источник
Я просто написал директиву для этого.
Использование:
Реализация:
тесты:
источник
Маршрут:
Меню HTML:
Контроллер:
Проблема, которую я обнаружил здесь, заключается в том, что пункт меню активен только при полной загрузке страницы. При частичном просмотре меню не меняется. Кто-нибудь знает, почему это происходит?
источник
источник
Я нашел самое простое решение. просто сравнить indexOf в HTML
источник