Si tengo una barra de navegación en bootstrap con los elementos
Home | About | Contact
¿Cómo configuro la clase activa para cada elemento del menú cuando están activos? Es decir, ¿cómo puedo configurar class="active"
cuando la ruta angular está en
#/
para casa#/about
para la página acerca de#/contact
para la página de contacto
javascript
twitter-bootstrap
angularjs
angularjs-directive
navbar
usuario1876508
fuente
fuente
Respuestas:
Una forma muy elegante es usar ng-controller para ejecutar un solo controlador fuera de ng-view:
e incluir en controllers.js:
fuente
return $location.path().indexOf(viewLocation) == 0;
lugar para que también pueda atrapar páginas con parámetroselegant
- el nombre de la ruta por ejemplo,/dogs
tiene que ser duplicado en la llamada aisActive('/dogs')
ui-sref-active/ui-sref-active-eq
directivas, es decir.ui-sref-active-eq='active'
oui-sref-active='active'
para lograr los mismos resultadosAcabo de escribir una directiva para manejar esto, por lo que simplemente puede agregar el atributo
bs-active-link
al<ul>
elemento padre , y cada vez que cambie la ruta, encontrará el enlace correspondiente y agregará laactive
clase a la correspondiente<li>
.Puedes verlo en acción aquí: http://jsfiddle.net/8mcedv3b/
HTML de ejemplo:
Javascript:
fuente
Puede echar un vistazo a AngularStrap , la directiva de barra de navegación parece ser lo que está buscando:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
Para usar esta directiva:
Descargue AngularStrap desde http://mgcrea.github.io/angular-strap/
Incluya el script en su página después de bootstrap.js:
<script src="lib/angular-strap.js"></script>
Agregue las directivas a su módulo:
angular.module('myApp', ['$strap.directives'])
Agregue la directiva a su barra de navegación:
<div class="navbar" bs-navbar>
Agregue expresiones regulares en cada elemento de navegación:
<li data-match-route="/about"><a href="#/about">About</a></li>
fuente
scope.$watch
)element
variable al selector jquery?$('...', element)
mgcrea.ngStrap
no es$strap.directives
Aquí hay un enfoque simple que funciona bien con Angular.
Dentro de su controlador AngularJS:
fuente
Si está trabajando con un enrutador angular, la directiva RouterLinkActive se puede usar con mucha elegancia:
fuente
active
clase debería estar en el<li>
(puede poner el routerLinkActive con el routerLink o su padre)/
como su página de inicio,routerLinkActive
lo considerará activo para cualquier URL que comience/
, por ejemplo/foo/
,/foo/bar
etc. Para que coincida exactamente, necesitarouterLinkActive="active" [routerLinkActiveOptions]="{exact:true}"
.En primer lugar, este problema se puede resolver de muchas maneras. Es posible que este camino no sea el más elegante, pero ciertamente funciona.
Aquí hay una solución simple que debería poder agregar a cualquier proyecto. Simplemente puede agregar una "pageKey" o alguna otra propiedad cuando configure su ruta que puede usar para desconectar. Además, puede implementar un escucha en el método $ routeChangeSuccess del objeto $ route para escuchar la finalización exitosa de un cambio de ruta.
Cuando se activa su controlador, obtiene la clave de página, y la usa para localizar elementos que deben ser "ACTIVOS" para esta página, y aplica la clase ACTIVE.
Tenga en cuenta que necesita una forma de hacer TODOS los elementos "EN ACTIVO". Como puede ver, estoy usando la clase .pageKey en mis elementos de navegación para desactivarlos, y estoy usando .pageKey_ {PAGEKEY} para activarlos individualmente. Cambiarlos a inactivos se consideraría un enfoque ingenuo, potencialmente obtendría un mejor rendimiento al usar la ruta anterior para hacer que solo los elementos activos estén inactivos, o podría alterar el selector jquery para seleccionar solo los elementos activos que se volverán inactivos. El uso de jquery para seleccionar todos los elementos activos es probablemente la mejor solución, ya que garantiza que todo se limpie para la ruta actual en caso de cualquier error css que pueda haber estado presente en la ruta anterior.
Lo que significaría cambiar esta línea de código:
a este
Aquí hay un código de muestra:
Dada una barra de navegación de arranque de
Y un módulo angular y controlador como el siguiente:
fuente
En realidad, puede usar la directiva angular-ui-utils
ui-route
:o:
Controlador de encabezado
Página de inicio
Si está utilizando ui-utils, también puede estar interesado en ui-router para administrar vistas parciales / anidadas.
fuente
Todas estas respuestas me parecen un poco complicadas, lo siento. Así que he creado una pequeña directiva que debería funcionar por barra de navegación:
Uso:
fuente
Utilizo la directiva ng-class con $ location para lograrlo.
Requiere que la barra de navegación esté dentro de un controlador principal con acceso al servicio $ location como este:
fuente
Puede lograr esto con un condicional en una expresión angular, como:
Dicho esto, creo que una directiva angular es la forma más "adecuada" de hacerlo, a pesar de que la subcontratación de gran parte de esta mini lógica puede contaminar de alguna manera su base de código.
Utilizo condicionales para el estilo de la GUI de vez en cuando durante el desarrollo, porque es un poco más rápido que crear directivas. Sin embargo, no podría decirte una instancia en la que realmente permanecieron en la base del código durante mucho tiempo. Al final, lo convierto en una directiva o encuentro una mejor manera de resolver el problema.
fuente
Si usa ui-router , el siguiente ejemplo debería satisfacer sus necesidades según el comentario de @ DanPantry sobre la respuesta aceptada sin agregar ningún código del lado del controlador:
Puede consultar los documentos para obtener más información al respecto.
fuente
ui.router
!Si prefiere no usar AngularStrap, entonces esta directiva debería ser la solución . Esta es una modificación de https://stackoverflow.com/a/16231859/910764 .
JavaScript
HTML
Nota: Las clases HTML anteriores suponen que está utilizando Bootstrap 3.x
fuente
Aquí está mi opinión al respecto. Una pequeña combinación de respuestas encontradas en esta publicación. Tuve un caso ligeramente diferente, por lo que mi solución consiste en separar el menú en su propia plantilla para usar dentro de la Directiva Definición Ojbect y luego agregar mi barra de navegación a la página en la que lo necesitaba. Básicamente, tenía una página de inicio de sesión en la que no quería incluir mi menú, así que utilicé ngInclude e inserté esta directiva cuando inicié sesión:
DIRECTIVA:
PLANTILLA DIRECTIVA (templates / menu.html)
HTML QUE INCLUYE LA DIRECTIVA
Espero que esto ayude
fuente
Extendiendo mi respuesta, necesitaba esto para manejar una estructura como esta.
-índice
-eventos <-active
--- lista de
eventos
--- edición de eventos --- mapa de eventos <-clicked
-places
--- place-list
--- place-edit
--- place-map
así que en lugar de hacer coincidir, tuve que usar indexOf, para validar enlaces secundarios que están formateados para coincidir con la condición. Entonces para 'eventos':
fuente
Esta es una solución simple.
fuente
Junto con la respuesta AngularStrap de @ Olivier, también implementé la respuesta de kevinknelson de: https://github.com/twbs/bootstrap/issues/9013 .
De forma nativa, la barra de navegación Bootstrap3 no fue diseñada para una aplicación de una sola página (por ejemplo, Angular) y, por lo tanto, el menú cuando se encontraba en una pantalla pequeña no se colapsó al hacer clic.
fuente
JavaScript
HTML
fuente
Gracias a @Pylinux . He usado su técnica y también la modifiqué para admitir "un" nivel de menú desplegable (sub ul / li), ya que eso es lo que necesitaba. Véalo en acción en el siguiente enlace de violín.
Fiddle actualizado basado en la respuesta de pylinux: http://jsfiddle.net/abhatia/en4qxw6g/
Hice los siguientes tres cambios, para admitir un menú desplegable de un nivel:
1. Agregué un valor de clase de dd (menú desplegable) para el elemento "a" debajo de li que necesita tener una lista ulterior.
2. Javascript actualizado para agregar la siguiente lógica nueva.
3. CSS actualizado para agregar lo siguiente:
Esperemos que esto sea útil para alguien que busque implementar un menú desplegable de un solo nivel.
fuente
Use un objeto como una variable de cambio.
Puede hacer esto en línea simplemente con:
Cada vez que hace clic en un enlace, el objeto de cambio se reemplaza por un nuevo objeto donde solo la propiedad correcta del objeto de cambio es verdadera. Las propiedades indefinidas se evaluarán como falsas, por lo que los elementos que dependen de ellas no tendrán asignada la clase activa.
fuente
También puede usar esta directiva de enlace activo https://stackoverflow.com/a/23138152/1387163
El padre li obtendrá una clase activa cuando la ubicación coincida / url :
fuente
Sugiero usar una directiva en un enlace. Aquí está el violín.
Pero aún no es perfecto. Cuidado con los hashbangs;)
Aquí está la directiva JavaScript para:
y así es como se usaría en html:
luego peinado con css:
fuente
Solo para agregar mis dos centavos en el debate, hice un módulo angular puro (sin jquery), y también funcionará con URL hash que contengan datos. ( ig
#/this/is/path?this=is&some=data
)Simplemente agrega el módulo como una dependencia y
auto-active
a uno de los antepasados del menú. Me gusta esto:Y el módulo se ve así:
* (Por supuesto, solo puede usar la parte directiva)
** También vale la pena notar que esto no funciona para los hashes vacíos ( ig
example.com/#
o simplementeexample.com
) que necesita tener al menosexample.com/#/
o soloexample.com#/
. Pero esto sucede automáticamente con ngResource y similares.fuente
Esto hizo el truco para mí:
luego usas jquery (también funciona con angular) para agregar la clase activa
y por supuesto el css:
esto funciona si tienes tu html como este:
esto agregará automáticamente la clase activa usando la URL de la página y coloreará su fondo a rojo si está en www.somesite.com/ee que es la 'aplicación' y estará activa
fuente
Esto fue respondido por mucho tiempo, pero pensé en compartir mi camino:
Modelo:
Para aquellos que usan
ui-router
:Por coincidencia exacta (por ejemplo, estados anidados?) El uso
$state.name === 'full/path/to/state'
oui-sref-active-eq="active"
fuente
Aquí hay otra solución para cualquiera que pueda estar interesado. La ventaja de esto es que tiene menos dependencias. Diablos, también funciona sin un servidor web. Entonces es completamente del lado del cliente.
HTML:
Explicación:
Aquí estamos generando los enlaces dinámicamente a partir de un modelo angularjs utilizando la directiva
ng-repeat
. La magia ocurre con los métodosselectTab()
ygetTabClass()
definidos en el controlador para esta barra de navegación presentada a continuación.Controlador:
Explicación:
selectTab()
El método se llama usando lang-click
directiva. Entonces, cuando se hace clic en el enlace, la variableselectedTab
se establece con el nombre de este enlace. En el HTML, puede ver que se llama a este método sin ningún argumento para la pestaña Inicio, de modo que se resaltará cuando se cargue la página.El
getTabClass()
método se llama víang-class
directiva en el HTML. Este método verifica si la pestaña en la que se encuentra es la misma que el valor de laselectedTab
variable. Si es verdadero, devuelve "activo", de lo contrario, devuelve "", que se aplica como nombre de clase porng-class
directiva. Entonces, cualquier css que haya aplicado a la claseactive
se aplicará a la pestaña seleccionada.fuente
Solo tendrá que agregar la
active
clase requerida con el código de color requerido.Ex:
ng-class="{'active': currentNavSelected}" ng-click="setNav"
fuente