¿AngularJS ayuda de alguna manera a establecer una active
clase en el enlace de la página actual?
Me imagino que hay una forma mágica de hacer esto, pero parece que no puedo encontrarlo.
Mi menú se ve así:
<ul>
<li><a class="active" href="/tasks">Tasks</a>
<li><a href="/actions">Tasks</a>
</ul>
y tengo controladores para cada uno de ellos en mis rutas: TasksController
y ActionsController
.
Pero no puedo encontrar una manera de vincular la clase "activa" en los a
enlaces a los controladores.
¿Alguna pista?
ngClass="{active: isActive('/tasks')}
, dondeisActive()
devolvería un valor booleano ya que desacopla el controlador y el marcado / estilo.Sugiero usar una directiva en un enlace.
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
var path = $(element).children("a")[0].hash.substring(1);
. Esto funcionará para un estilo como<li active-link="active"><a href="#/dashboard">Dashboard</a></li>
scope.$watch('location.path()', function(newPath) {
parascope.$on('$locationChangeStart', function(){
.var path = attrs.href;
avar path = attrs.href||attrs.ngHref;
<li>
, puede cambiarelement.addClass(clazz);
aelement.parent().addClass(clazz);
Aquí hay un enfoque simple que funciona bien con Angular.
Dentro de su controlador AngularJS:
Este hilo tiene otras respuestas similares.
¿Cómo configurar la clase activa bootstrap navbar con Angular JS?
fuente
return viewLocation === $location.path()
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. (por ejemplo
#/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 (por ejemplo,
example.com/#
o simplementeexample.com
), debe tener al menosexample.com/#/
o soloexample.com#/
. Pero esto sucede automáticamente con ngResource y similares.Y aquí está el violín: http://jsfiddle.net/gy2an/8/
fuente
En mi caso, resolví este problema creando un controlador simple responsable de la navegación
Y simplemente agregando ng-class al elemento así:
fuente
Para usuarios de enrutador AngularUI :
Y eso colocará una
active
clase en el objeto seleccionado.fuente
Hay una
ng-class
directiva, que une la variable y la clase css. También acepta el objeto (className vs pares de valores bool).Aquí está el ejemplo, http://plnkr.co/edit/SWZAqj
fuente
/test1/blahblah
o sí?active: activePath=='/test1'
automáticamente devuelve un "activo" si la ruta comienza con la cadena dada? ¿Es este un tipo de operador predefinido o regex?==
controles repetidos en el html.La respuesta de @ Renan-tomal-fernandes es buena, pero necesitaba un par de mejoras para funcionar correctamente. Tal como estaba, siempre detectaría el enlace a la página de inicio (/) como activado, incluso si estuviera en otra sección.
Así que lo mejoré un poco, aquí está el código. Trabajo con Bootstrap, por lo que la parte activa está en el
<li>
elemento en lugar de la<a>
.Controlador
Modelo
fuente
Aquí está la solución que se me ocurrió después de leer algunas de las excelentes sugerencias anteriores. En mi situación particular, estaba tratando de usar el componente de pestañas Bootstrap como mi menú, pero no quería usar la versión Angular-UI de esto porque quiero que las pestañas actúen como un menú, donde cada pestaña puede agregar marcadores, en lugar de que las pestañas actúen como navegación para una sola página. (Consulte http://angular-ui.github.io/bootstrap/#/tabs si está interesado en cómo se ve la versión Angular-UI de las pestañas bootstrap).
Realmente me gustó la respuesta de kfis sobre la creación de su propia directiva para manejar esto, sin embargo, parecía engorroso tener una directiva que debía colocarse en cada enlace. Así que he creado mi propia directiva angular que se coloca una vez en el
ul
. En caso de que alguien más esté tratando de hacer lo mismo, pensé en publicarlo aquí, aunque como dije, muchas de las soluciones anteriores también funcionan. Esta es una solución un poco más compleja en lo que respecta a JavaScript, pero crea un componente reutilizable con un marcado mínimo.Aquí está el javascript para la directiva y el proveedor de ruta para
ng:view
:Luego, en su html, simplemente:
Aquí está el plunker para ello: http://plnkr.co/edit/xwGtGqrT7kWoCKnGDHYN?p=preview .
fuente
Puede implementar esto de manera muy simple, aquí hay un ejemplo:
Y su controlador debería ser este:
fuente
use la directiva ui-sref-active de angular-ui-router https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statename
fuente
Tuve un problema similar con el menú ubicado fuera del alcance del controlador. No estoy seguro de si esta es la mejor solución o una recomendada, pero esto es lo que funcionó para mí. He agregado lo siguiente a la configuración de mi aplicación:
Entonces en la vista tengo:
fuente
Uso de la versión angular 6 con Bootstrap 4.1
Pude hacerlo como se ve a continuación.
En el ejemplo a continuación, cuando la URL ve '/ contact', el bootstrap activo se agrega a la etiqueta html. Cuando la URL cambia, se elimina.
Lea más en el sitio web de Angular
fuente
Usando una directiva (ya que estamos haciendo manipulación DOM aquí), lo siguiente es probablemente lo más cercano a hacer las cosas de la "forma angular":
Entonces su HTML se vería así:
fuente
menu-item
parece redundante en cada línea. Quizás sea mejor adjuntar un atributo alul
elemento (por ejemplo<ul menu>
), pero no estoy seguro de si eso sería posible.Lo hice así:
Esto le permite tener enlaces en una sección que tiene una directiva de seguimiento activo:
Este enfoque me parece mucho más limpio que otros.
Además, si está utilizando jQuery, puede hacerlo mucho más ordenado porque jQlite solo tiene soporte de selector básico. Una versión mucho más limpia con jquery incluida antes de incluir angular se vería así:
Aquí hay un jsFiddle
fuente
Mi solución a este problema, uso
route.current
en la plantilla angular.Como tiene la
/tasks
ruta para resaltar en su menú, puede agregar su propia propiedadmenuItem
a las rutas declaradas por su módulo:Luego, en su plantilla
tasks.html
, puede usar la siguienteng-class
directiva:En mi opinión, esto es mucho más limpio que todas las soluciones propuestas.
fuente
Aquí hay una extensión de la directiva kfis que hice para permitir diferentes niveles de coincidencia de ruta. Esencialmente encontré la necesidad de hacer coincidir las rutas de URL hasta una cierta profundidad, ya que la coincidencia exacta no permite el anidamiento y las redirecciones de estado predeterminadas. Espero que esto ayude.
Y así es como uso el enlace
Esta directiva coincidirá con el nivel de profundidad especificado en el valor del atributo para la directiva. Solo significa que se puede usar en otros lugares muchas veces.
fuente
Aquí hay otra directiva para resaltar los enlaces activos.
Características clave:
Código:
Uso:
Ejemplo simple con expresión angular, digamos $ scope.var = 2 , luego el enlace estará activo si la ubicación es / url / 2 :
Ejemplo de Bootstrap, el padre li obtendrá una clase activa:
Ejemplo con URL anidadas, el enlace estará activo si alguna url anidada está activa (es decir, / url / 1 , / url / 2 , url / 1/2 / ... )
Ejemplo complejo, el enlace apunta a una url ( / url1 ) pero estará activo si se selecciona otra ( / url2 ):
Ejemplo con enlace deshabilitado, si no está activo tendrá la clase 'deshabilitado' :
Todos los atributos active-link- * se pueden usar en cualquier combinación, por lo que se podrían implementar condiciones muy complejas.
fuente
Si desea los enlaces para la directiva en un contenedor en lugar de seleccionar cada enlace individual (hace que sea más fácil ver el alcance en Batarang), esto también funciona bastante bien:
El marcado solo sería:
También debería mencionar que estoy usando jQuery 'lleno de grasa' en este ejemplo, pero puede modificar fácilmente lo que he hecho con el filtrado, etc.
fuente
Aquí están mis dos centavos, esto funciona bien.
NOTA: Esto no coincide con las páginas secundarias (que es lo que necesitaba).
Ver:
Controlador:
fuente
De acuerdo con la respuesta de @kfis, se trata de comentarios, y mi recomendación, la directiva final de la siguiente manera:
fuente
Para aquellos que usan enrutador ui, mi respuesta es algo similar a la de Ender2050, pero prefiero hacer esto a través de pruebas de nombre de estado:
HTML correspondiente:
fuente
Ninguna de las sugerencias de directivas anteriores me fue útil. Si tienes una barra de navegación de arranque como esta
(que podría ser un
$ yo angular
inicio), entonces desea agregar.active
a la lista de clases de elementos primarios<li>
, no el elemento en sí; es decir<li class="active">..</li>
. Entonces escribí esto:uso
set-parent-active
;.active
es predeterminado, por lo que no es necesario configurarloy el padre
<li>
elemento estará.active
cuando el enlace esté activo. Para usar una.active
clase alternativa como.highlight
, simplementefuente
Lo más importante para mí fue no cambiar en absoluto el código predeterminado de arranque. Aquí es mi controlador de menú el que busca las opciones de menú y luego agrega el comportamiento que queremos.
fuente
Tuve el mismo problema. Aquí está mi solución :
fuente
Acabo de escribir una directiva para esto.
Uso:
Implementación:
Pruebas:
fuente
La ruta:
El menú html:
El controlador:
El problema que encontré aquí es que el elemento del menú está activo solo cuando se carga la página completa. Cuando se carga la vista parcial, el menú no cambia. Alguien sabe por qué sucede?
fuente
fuente
Encontré la solución más fácil. solo para comparar indexOf en HTML
fuente