ПРИМЕЧАНИЕ. Здесь есть много разных ответов, и большинство из них были действительны в тот или иной момент. Дело в том, что то, что работает, несколько раз менялось, когда команда Angular меняла свой маршрутизатор. Маршрутизатор версия 3.0 , которая в конечном итоге будет маршрутизатором в угловых перерывах многих из этих решений, но предлагает очень простое решение самостоятельно. Начиная с RC.3, предпочтительным решением является использование, как показано в этом ответе .[routerLinkActive]
В приложении Angular (текущем в версии 2.0.0-бета.0, когда я пишу это), как вы определяете, какой сейчас активный маршрут?
Я работаю над приложением, которое использует Bootstrap 4, и мне нужен способ пометить навигационные ссылки / кнопки как активные, когда их связанный компонент отображается в <router-output>
теге.
Я понимаю, что могу поддерживать состояние самостоятельно, когда нажата одна из кнопок, но это не будет охватывать случай наличия нескольких путей в одном маршруте (скажем, главное навигационное меню, а также локальное меню в главном компоненте). ).
Любые предложения или ссылки будут оценены. Спасибо.
источник
@input
опции for, но онexact: false
активирует класс всякий раз, когда братья и сестры текущего маршрута также активны.router.navigate()
будет работать нормально.routerLinkActive
это просто индикатор того, представляет ли эта ссылка активный маршрут.Я ответил на это в другом вопросе, но я верю, что это может относиться и к этому. Вот ссылка на оригинальный ответ: Angular 2: Как определить активный маршрут с параметрами?
Я пытался установить активный класс, не зная точно, каково текущее местоположение (используя имя маршрута) . Лучшее решение, которое у меня есть, это использование функции isRouteActive, доступной в
Router
классе.router.isRouteActive(instruction): Boolean
принимает один параметр, который являетсяInstruction
объектом маршрута, и возвращаетtrue
илиfalse
то, выполняется ли эта инструкция для текущего маршрута или нет. Вы можете сгенерировать маршрутInstruction
, используяRouter
' generate (linkParams: Array) . LinkParams имеет тот же формат, что и значение, переданное в директиву routerLink (напримерrouter.isRouteActive(router.generate(['/User', { user: user.id }]))
).Вот как может выглядеть RouteConfig (я немного подправил его, чтобы показать использование параметров) :
И вид будет выглядеть так:
До сих пор это было мое предпочтительное решение проблемы, оно может быть полезным и для вас.
источник
router.isRouteActive('Home')
.Router
в конструктор классаname
вместоas
объекта конфигурации маршрутизатора.router.urlTree.contains(router.createUrlTree(['Home']))
Я решил проблему, с которой столкнулся по этой ссылке, и выяснил, что для вашего вопроса есть простое решение. Вы можете использовать
router-link-active
вместо этого в своих стилях.источник
router-link-active
класс не добавляется к активномуa
илиli
. но есть одно место, где я использую бутстрап,nav-tabs
и оно работает там.Небольшое улучшение ответа @ alex-correia-santos на основе https://github.com/angular/angular/pull/6407#issuecomment-190179875
И используйте это так:
источник
styles : [
.active {background-color: aliceblue; }]
. +1 это работаетВы можете проверить текущий маршрут, введя
Location
объект в контроллер и проверивpath()
, например, так:Вы должны будете убедиться, что импортируете это сначала:
Затем вы можете использовать регулярное выражение для сопоставления с путем, который возвращается, чтобы увидеть, какой маршрут активен. Обратите внимание, что
Location
класс возвращает нормализованный путь независимо от того, какой путьLocationStrategy
вы используете. Таким образом , даже если вы используетеHashLocationStragegy
пути возвращаемые все еще будет иметь вид/foo/bar
не#/foo/bar
источник
ОБНОВЛЕНИЕ: обновлено согласно Angular2.4.x
узнать больше...
источник
Для обозначения активных маршрутов
routerLinkActive
можно использоватьЭто также работает на других элементах, таких как
Если частичные совпадения также должны быть отмечены, используйте
Насколько я знаю,
exact: false
это будет по умолчанию в RC.4источник
Прямо сейчас я использую rc.4 с начальной загрузкой 4, и этот работает отлично для меня:
Это будет работать для URL: / home
источник
/home/whatever
?exact
значит, этот маршрут будет иметь то же имя. И это необходимо, если вы планируете использовать его с такими инструментами, как Twitter bootstrap. Он уже обрабатывает состояние активной ссылки и безexact
опции не будет работать. (не уверен насчет того, как это работает в ядре, я попробовал, и это работает для меня)Ниже приведен метод использования RouteData для стилизации элементов menuBar в зависимости от текущего маршрута:
RouteConfig включает данные с вкладки (текущий маршрут):
Часть макета:
Класс:
источник
Просто подумал, что я бы добавил в пример, который не использует машинописный текст:
routerLinkActive
Переменный связанно с переменным шаблоном , а затем повторно использоваться по мере необходимости. К сожалению, единственное предостережение в том, что вы не можете иметь все это в<section>
элементе, поскольку это#home
должно быть решено до того, как парсер попадет<section>
.источник
Router
в Angular 2 RC больше не определеныisRouteActive
иgenerate
методы.Попробуйте следовать
уведомление,
routeSegment : RouteSegment
должно быть введено в конструктор компонента.источник
Вот полный пример добавления активного стиля маршрута в версии Angular,
2.0.0-rc.1
который учитывает нулевые корневые пути (напримерpath: '/'
)app.component.ts -> Маршруты
app.component.html
источник
Решение для Angular2 RC 4:
источник
Начиная с Angular 8, это работает:
{ exact: true }
гарантирует, что он соответствует URL.источник
в 2020 году, если вы хотите установить активный класс для элемента, который не имеет [routerLink] - вы можете просто сделать:
источник
Еще один обходной путь. Гораздо проще в Angular Router V3 Alpha. вводя роутер
использование
источник
В Angular2 RC2 вы можете использовать эту простую реализацию
это добавит класс
active
к элементу с совпавшим URL, подробнее об этом здесьисточник
Ниже приведены ответы на этот вопрос для всех версий Angular 2 RC, выпущенных до даты:
RC4 и RC3 :
Для применения класса к ссылке или предку ссылки:
/ home должен быть URL-адресом, а не именем маршрута, поскольку свойство имени больше не существует в объекте маршрутизации с версии Router v3.
Подробнее о директиве routerLinkActive по этой ссылке .
Для применения класса к любому div на основе текущего маршрута:
например
RC2 и RC1 :
Используйте комбинацию router.isRouteActive и class. *. например, применять активный класс на основе Home Route.
Имя и URL могут быть переданы в router.generate.
источник
Использование
routerLinkActive
полезно в простых случаях, когда есть ссылка, и вы хотите применить некоторые классы. Но в более сложных случаях, когда у вас может не быть routerLink или когда вам нужно что-то еще, вы можете создать и использовать канал :затем:
и не забудьте включить pipe в зависимости от pipe;)
источник
containsTree
определяется?Для Angular версии 4+ вам не нужно использовать какое-либо сложное решение. Вы можете просто использовать
[routerLinkActive]="'is-active'"
.Для примера с загрузочной ссылкой 4:
источник
Экземпляр класса Router на самом деле является Observable, и он возвращает текущий путь каждый раз, когда изменяется. Вот как я это делаю:
И тогда в моем HTML:
источник
Как упомянуто в одном из комментариев принятого ответа,
routerLinkActive
директива может также применяться к контейнеру фактического<a>
тега.Так, например, с вкладками Twitter Bootstrap, где активный класс должен применяться к
<li>
тегу, который содержит ссылку:Довольно аккуратно! Я предполагаю, что директива проверяет содержимое тега и ищет
<a>
тег сrouterLink
директивой.источник
Простое решение для пользователей angular 5 - просто добавьте
routerLinkActive
в список.routerLinkActive
Директива связана с маршрутом черезrouterLink
директиву.В качестве входных данных он принимает массив классов, которые он добавит к элементу, к которому он присоединен, если его маршрут в данный момент активен, например:
Приведенное выше добавит класс active к тегу привязки, если мы в данный момент просматриваем домашний маршрут.
источник
А в последней версии Angular вы можете просто сделать проверку
router.isActive(routeNameAsString)
. Например, см. Пример ниже:И убедитесь, что вы не забыли ввести роутер в свой компонент.
источник
Я искал способ использовать навигацию в стиле Twitter Bootstrap с Angular2, но у меня были проблемы с получением
active
применить класс к родительскому элементу выбранной ссылки. Обнаружил, что решение @ alex-correia-santos работает отлично!Компонент, содержащий ваши вкладки, должен импортировать маршрутизатор и определить его в своем конструкторе, прежде чем вы сможете выполнить необходимые вызовы.
Вот упрощенная версия моей реализации ...
источник
допустим, вы хотите добавить CSS в мое активное состояние / вкладку. Используйте routerLinkActive, чтобы активировать вашу маршрутную ссылку.
примечание: «active» - это имя моего класса здесь
источник
Я использую угловой маршрутизатор,
^3.4.7
и у меня все еще есть проблемы сrouterLinkActive
директивой.Это не работает, если у вас есть несколько ссылок с одним и тем же URL-адресом, и, кажется, не обновляется все время.
Вдохновленный ответом @tomaszbak, я создал небольшой компонент для работы
источник
Чистый HTML шаблон будет похож
источник
начать с импорта RouterLinkActive в ваши .ts
Теперь используйте RouterLinkActive в вашем HTML
предоставить некоторую CSS для класса "class_Name", так как, когда эта ссылка будет активна / нажата, вы найдете этот класс на промежутке во время проверки.
источник
Программным способом было бы сделать это в самом компоненте. Я три недели боролся с этой проблемой, но разочаровался в угловых документах и прочитал реальный код, который заставил работать routerlinklink, и вот о лучших документах, которые я могу найти.
Примечание :
для программирования обязательно добавьте ссылку на маршрутизатор, и она принимает дочерний элемент. Если вы хотите изменить это, вам нужно избавиться от детей на
superclass.nativeElement
.источник