Если у меня есть Navbar в начальной загрузке с элементами
Home | About | Contact
Как установить активный класс для каждого пункта меню, когда они активны? То есть, как я могу установить, class="active"
когда угловой маршрут в
#/
для дома#/about
для страницы о#/contact
для страницы контактов
Ответы:
Очень элегантный способ - использовать ng-controller для запуска одного контроллера за пределами ng-view:
и включите в controllers.js:
источник
return $location.path().indexOf(viewLocation) == 0;
вместо этого, чтобы вы могли поймать страницы с параметрами, а такжеelegant
- название маршрута, например/dogs
, должно быть продублировано во время звонкаisActive('/dogs')
ui-sref-active/ui-sref-active-eq
директивы, т.е.ui-sref-active-eq='active'
илиui-sref-active='active'
для достижения тех же результатовЯ просто написал директиву для этого, так что вы можете просто добавить атрибут
bs-active-link
к родительскому<ul>
элементу, и каждый раз, когда маршрут изменяется, он находит соответствующую ссылку и добавляетactive
класс к соответствующему<li>
.Вы можете увидеть это в действии здесь: http://jsfiddle.net/8mcedv3b/
Пример HTML:
Javascript:
источник
Вы можете взглянуть на AngularStrap , кажется, что вы ищете директиву navbar:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
Чтобы использовать эту директиву:
Загрузите AngularStrap с http://mgcrea.github.io/angular-strap/
Включите скрипт на своей странице после bootstrap.js:
<script src="lib/angular-strap.js"></script>
Добавьте директивы к вашему модулю:
angular.module('myApp', ['$strap.directives'])
Добавьте директиву на вашу панель навигации:
<div class="navbar" bs-navbar>
Добавьте регулярные выражения для каждого элемента навигации:
<li data-match-route="/about"><a href="#/about">About</a></li>
источник
scope.$watch
)element
переменная передается в селектор jquery?$('...', element)
mgcrea.ngStrap
нет$strap.directives
Вот простой подход, который хорошо работает с Angular.
В вашем контроллере AngularJS:
источник
Если вы работаете с Angular router, директива RouterLinkActive может использоваться очень элегантно:
источник
active
класс должен быть в<li>
(вы можете поместить routerLinkActive с routerLink или его родителем)/
качестве домашней страницы,routerLinkActive
будет считать, что активным для любого URL, начиная с/
, например/foo/
,/foo/bar
и т. Д. Для точного соответствия вам нужноrouterLinkActive="active" [routerLinkActiveOptions]="{exact:true}"
.Прежде всего, эта проблема может быть решена многими способами. Этот способ может быть не самым элегантным, но, безусловно, работает.
Вот простое решение, которое вы можете добавить в любой проект. Вы можете просто добавить «pageKey» или другое свойство при настройке маршрута, который вы можете использовать для отключения ключа. Кроме того, вы можете реализовать прослушиватель для метода $ routeChangeSuccess объекта $ route, чтобы прослушивать успешное завершение изменения маршрута.
Когда ваш обработчик запускается, вы получаете ключ страницы и используете этот ключ, чтобы найти элементы, которые должны быть «ACTIVE» для этой страницы, и вы применяете класс ACTIVE.
Имейте в виду, вам нужен способ сделать ВСЕ элементы "В АКТИВНЫХ". Как вы можете видеть, я использую класс .pageKey на своих элементах навигации, чтобы отключить их все, и я использую .pageKey_ {PAGEKEY}, чтобы включить их по отдельности. Переключение их всех на неактивные, будет считаться наивным подходом, потенциально вы получите более высокую производительность, если использовать предыдущий маршрут, чтобы сделать только активные элементы неактивными, или вы можете изменить селектор jquery, чтобы выбрать только активные элементы, которые будут сделаны неактивными. Использование jquery для выбора всех активных элементов, вероятно, является наилучшим решением, поскольку оно обеспечивает очистку всего для текущего маршрута в случае любых ошибок CSS, которые могли присутствовать на предыдущем маршруте.
Что будет означать изменение этой строки кода:
к этому
Вот пример кода:
Учитывая загрузчик Навбар
И угловой модуль и контроллер вроде следующего:
источник
Вы можете использовать угловую-UI-Utils '
ui-route
директиву:или:
Контроллер Заголовка
Индексная страница
Если вы используете ui-utils, вас также может заинтересовать ui-router для управления частичными / вложенными представлениями.
источник
Я нахожу все эти ответы немного сложными для меня, извините. Итак, я создал небольшую директиву, которая должна работать для каждой панели навигации:
Использование:
источник
Я использую директиву ng-class с $ location для достижения этого.
Для этого требуется, чтобы панель навигации находилась внутри основного контроллера с доступом к службе $ location, например:
источник
Вы можете достичь этого с помощью условного выражения, например:
При этом я считаю, что угловая директива является более "правильным" способом сделать это, хотя большая часть этой мини-логики может несколько испортить вашу кодовую базу.
Я использую условные выражения для стилизации GUI время от времени во время разработки, потому что это немного быстрее, чем создание директив. Я не могу сказать вам пример, в котором они действительно долго оставались в кодовой базе. В конце концов я либо превращаю это в директиву, либо нахожу лучший способ решения проблемы.
источник
Если вы используете ui-router , следующий пример должен удовлетворить ваши потребности, основываясь на комментарии @ DanPantry о принятом ответе без добавления кода на стороне контроллера:
Вы можете проверить документы для получения дополнительной информации об этом.
источник
ui.router
!Если вы не хотите использовать AngularStrap, тогда эта директива должна помочь! Это модификация https://stackoverflow.com/a/16231859/910764 .
JavaScript
HTML
Примечание. Приведенные выше классы HTML предполагают, что вы используете Bootstrap 3.x
источник
Вот мой взгляд на это. Небольшая комбинация ответов найдена на этом посте. У меня был немного другой случай, поэтому мое решение заключается в разделении меню на собственный шаблон, который будет использоваться в объекте определения директивы, а затем добавление панели навигации на страницу, на которой оно мне было необходимо. По сути, у меня была страница входа, на которую я не хотел включать свое меню, поэтому я использовал ngInclude и вставил эту директиву при входе в систему:
ДИРЕКТИВА:
ПРЯМОЙ ШАБЛОН (templates / menu.html)
HTML, КОТОРЫЙ ВКЛЮЧАЕТ ДИРЕКТИВ
Надеюсь это поможет
источник
Расширяя myl-ответ, мне нужно было это для управления такой структурой.
-индекс
-events <-active
--- список
событий --- event-edit
--- карта событий <-clicked
-places
--- список мест
--- место редактирования
--- карта мест
поэтому вместо сопоставления мне пришлось использовать indexOf, чтобы проверять дочерние ссылки, отформатированные в соответствии с условием. Итак, для «событий»:
источник
Это простое решение
источник
Вместе с ответом @ Olivier's AngularStrap я также реализовал ответ kevinknelson по адресу : https://github.com/twbs/bootstrap/issues/9013 .
По сути, панель навигации Bootstrap3 не была разработана для одностраничного (например, углового) приложения и, следовательно, меню, когда на маленьком экране не происходило свертывание при нажатии.
источник
JavaScript
HTML
источник
Благодаря @Pylinux . Я использовал его технику, а также изменил ее, чтобы поддерживать «один» уровень выпадающего меню (sub ul / li), так как это то, что мне было нужно. Посмотрите это в действии в ссылке скрипта ниже.
Обновленный Fiddle на основе ответа Pylinux - http://jsfiddle.net/abhatia/en4qxw6g/
Я сделал следующие три изменения, чтобы поддержать одно выпадающее меню уровня:
1. Добавил значение класса dd (выпадающий список) для элемента "a" в li, который должен иметь список sub ul.
2. Обновлен Javascript, чтобы добавить следующую новую логику.
3. Обновлен CSS, чтобы добавить следующее:
Надеюсь, это будет полезно для тех, кто хочет реализовать одноуровневое выпадающее меню.
источник
Используйте объект в качестве переменной-переключателя.
Вы можете сделать это встроенным довольно просто:
Каждый раз, когда вы нажимаете на ссылку, объект переключателя заменяется новым объектом, для которого истинным является только правильное свойство объекта переключателя. Неопределенные свойства будут оцениваться как ложные, и поэтому элементам, которые зависят от них, не будет присвоен активный класс.
источник
Вы также можете использовать эту директиву активной ссылки https://stackoverflow.com/a/23138152/1387163
Родитель li получит активный класс, когда местоположение совпадет с / url :
источник
Я предлагаю использовать директиву по ссылке. Вот скрипка.
Но это еще не идеально. Остерегайтесь hashbangs;)
Вот javascript для директивы:
и вот как это будет использоваться в HTML:
потом стиль с помощью CSS:
источник
Чтобы добавить два цента в дебаты, я сделал чисто угловой модуль (без jquery), и он также будет работать с хеш-адресами, содержащими данные. ( иг
#/this/is/path?this=is&some=data
)Вы просто добавляете модуль в качестве зависимости и
auto-active
к одному из предков меню. Как это:И модуль выглядит так:
* (Конечно, вы можете просто использовать директивную часть)
** Также стоит заметить, что это не работает для пустых хешей ( ig
example.com/#
или простоexample.com
), которое нужно иметь по крайней мереexample.com/#/
или простоexample.com#/
. Но это происходит автоматически с помощью ngResource и тому подобного.источник
Это помогло мне:
Затем вы используете JQuery (работает с Angular тоже), чтобы добавить класс Active
и конечно же css:
это работает, если у вас есть ваш HTML, как это:
это автоматически добавит класс active с помощью URL-адреса страницы и раскрасит фон в красный, если на www.somesite.com/ee thaen ee указано «app», и оно будет активным.
источник
Это давно ответили, но я думал, что поделюсь своим путем:
Шаблон:
Для тех, кто использует
ui-router
:Для точного соответствия (например, вложенные состояния?) Используйте
$state.name === 'full/path/to/state'
илиui-sref-active-eq="active"
источник
Вот еще одно решение для тех, кто может быть заинтересован. Преимущество этого в том, что у него меньше зависимостей. Черт, он работает и без веб-сервера. Так что это полностью на стороне клиента.
HTML:
Объяснение:
Здесь мы генерируем ссылки динамически из модели angularjs, используя директиву
ng-repeat
. Волшебство происходит с методамиselectTab()
иgetTabClass()
определенными в контроллере для этой панели навигации, представленной ниже.контроллер:
Объяснение:
selectTab()
Метод вызывается с использованиемng-click
директивы. Поэтому, когда ссылка нажата, переменнаяselectedTab
присваивается имя этой ссылки. В HTML вы можете видеть, что этот метод вызывается без каких-либо аргументов для вкладки Home, поэтому он будет выделен при загрузке страницы.getTabClass()
Метод вызывается с помощьюng-class
директивы в HTML. Этот метод проверяет, совпадает ли вкладка, в которой он находится, со значениемselectedTab
переменной. Если true, он возвращает «active», иначе возвращает «», которое применяется в качестве имени классаng-class
директивой. Затем все выбранные вами классыactive
будут применены к выбранной вкладке.источник
Просто вам нужно будет добавить требуемый
active
класс с требуемым кодом цвета.Пример:
ng-class="{'active': currentNavSelected}" ng-click="setNav"
источник