NOTA: Aquí hay muchas respuestas diferentes, y la mayoría han sido válidas en un momento u otro. El hecho es que lo que funciona ha cambiado varias veces a medida que el equipo de Angular ha cambiado su enrutador. La versión Router 3.0 que eventualmente será el enrutador en Angular rompe muchas de estas soluciones, pero ofrece una solución muy simple propia. A partir de RC.3, la solución preferida es usar [routerLinkActive]
como se muestra en esta respuesta .
En una aplicación angular (actual en la versión 2.0.0-beta.0 mientras escribo esto), ¿cómo determina cuál es la ruta actualmente activa?
Estoy trabajando en una aplicación que usa Bootstrap 4 y necesito una forma de marcar los enlaces / botones de navegación como activos cuando su componente asociado se muestra en una <router-output>
etiqueta.
Me doy cuenta de que podría mantener el estado yo mismo cuando se hace clic en uno de los botones, pero eso no cubriría el caso de tener múltiples rutas en la misma ruta (por ejemplo, un menú de navegación principal y un menú local en el componente principal). )
Cualquier sugerencia o enlaces serán apreciados. Gracias.
fuente
@input
opciones for, peroexact: false
activa la clase siempre que los hermanos de la ruta actual también estén activos.router.navigate()
funcionaría bien.routerLinkActive
es simplemente un indicador de si este enlace representa la ruta activa.He respondido esto en otra pregunta, pero creo que también podría ser relevante para esta. Aquí hay un enlace a la respuesta original: Angular 2: ¿Cómo determinar la ruta activa con parámetros?
He estado tratando de configurar la clase activa sin tener que saber exactamente cuál es la ubicación actual (usando el nombre de la ruta) . La mejor solución a la que he llegado hasta ahora es usar la función isRouteActive disponible en la
Router
clase.router.isRouteActive(instruction): Boolean
toma un parámetro que es unInstruction
objeto de ruta y devuelvetrue
ofalse
si esa instrucción es verdadera o no para la ruta actual. Puede generar una rutaInstruction
mediante el uso deRouter
' generate (linkParams: Array) . LinkParams sigue exactamente el mismo formato que un valor pasado a una directiva routerLink (por ejemplorouter.isRouteActive(router.generate(['/User', { user: user.id }]))
).Así es como podría verse el RouteConfig (lo modifiqué un poco para mostrar el uso de los parámetros) :
Y la Vista se vería así:
Esta ha sido mi solución preferida para el problema hasta ahora, también puede ser útil para usted.
fuente
router.isRouteActive('Home')
.Router
en constructor de clasename
lugar delas
objeto de configuración del enrutador.router.urlTree.contains(router.createUrlTree(['Home']))
Resolví un problema que encontré en este enlace y descubrí que hay una solución simple para su pregunta. En su
router-link-active
lugar, podría usar en sus estilos.fuente
router-link-active
clase no se agrega al activoa
oli
. pero hay un lugar donde estoy usando bootstrapnav-tabs
y funciona allí.Pequeña mejora a la respuesta de @ alex-correia-santos basada en https://github.com/angular/angular/pull/6407#issuecomment-190179875
Y úsalo así:
fuente
styles : [
.active {background-color: aliceblue; }]
. +1 funcionaPuede verificar la ruta actual inyectando el
Location
objeto en su controlador y verificandopath()
así:Tendrás que asegurarte de importarlo primero:
Luego puede usar una expresión regular para hacer coincidir la ruta que se devuelve para ver qué ruta está activa. Tenga en cuenta que la
Location
clase devuelve una ruta normalizada independientemente de cuálLocationStrategy
esté usando. Por lo tanto, incluso si está utilizando lasHashLocationStragegy
rutas devueltas seguirán siendo de la forma/foo/bar
no#/foo/bar
fuente
ACTUALIZACIÓN: actualizado según Angular2.4.x
ver más...
fuente
Para marcar rutas activas
routerLinkActive
se puede utilizarEsto también funciona en otros elementos como
Si las coincidencias parciales también deben marcarse, use
Hasta donde sé,
exact: false
será el valor predeterminado en RC.4fuente
En este momento estoy usando rc.4 con bootstrap 4 y este funciona perfecto para mí:
Esto funcionará para url: / home
fuente
/home/whatever
?exact
decir, esa ruta tendrá el mismo nombre. Y esto es necesario si planea usarlo con herramientas como Twitter Bootstrap. Ya maneja el estado del enlace activo y sinexact
opción no funcionará. (no estoy seguro de cómo funciona en el núcleo, lo probé y funciona para mí)A continuación se muestra el método que utiliza RouteData para diseñar elementos de la barra de menú según la ruta actual:
RouteConfig incluye datos con pestaña (ruta actual):
Una pieza de diseño:
Clase:
fuente
Solo pensé que agregaría un ejemplo que no usa ningún mecanografiado:
La
routerLinkActive
variable está vinculada a una variable de plantilla y luego se reutiliza según sea necesario. Desafortunadamente, la única advertencia es que no puede tener todo esto en el<section>
elemento, ya#home
que debe resolverse antes de que se ejecute el analizador<section>
.fuente
Router
en Angular 2 RC ya no defineisRouteActive
ygenerate
métodos.Intenta seguir
aviso,
routeSegment : RouteSegment
debe inyectarse en el constructor del componente.fuente
Aquí hay un ejemplo completo para agregar un estilo de ruta activo en la versión angular
2.0.0-rc.1
que tiene en cuenta las rutas raíz nulas (por ejemplopath: '/'
)app.component.ts -> Rutas
app.component.html
fuente
Solución para Angular2 RC 4:
fuente
A partir de Angular 8, esto funciona:
{ exact: true }
asegura que coincida con la url.fuente
en 2020 si desea establecer la clase activa en un elemento que no tiene [routerLink], puede hacer simplemente:
fuente
Otra solución alternativa. Mucho más fácil en Angular Router V3 Alpha. inyectando el enrutador
uso
fuente
En Angular2 RC2 puedes usar esta implementación simple
esto agregará clase
active
al elemento con url coincidente, lea más sobre esto aquífuente
A continuación se encuentran las respuestas a esta pregunta para todas las versiones de Angular 2 RC lanzadas hasta la fecha:
RC4 y RC3 :
Para aplicar la clase al enlace o al antecesor del enlace:
/ home debería ser la URL y no el nombre de la ruta, ya que la propiedad de nombre ya no existe en el objeto de ruta a partir del enrutador v3.
Más información sobre la directiva routerLinkActive en este enlace .
Para aplicar la clase a cualquier div en función de la ruta actual:
p.ej
RC2 y RC1 :
Use la combinación de router.isRouteActive y class. *. por ejemplo, para aplicar la clase activa basada en la ruta local.
El nombre y la URL se pueden pasar al router.generate.
fuente
El uso
routerLinkActive
es bueno en casos simples, cuando hay un enlace y desea aplicar algunas clases. Pero en casos más complejos donde es posible que no tenga un routerLink o donde necesite algo más, puede crear y usar una tubería :luego:
y no olvides incluir la tubería en las dependencias de las tuberías;)
fuente
containsTree
define?Para la versión angular 4+, no necesita usar ninguna solución compleja. Simplemente puedes usar
[routerLinkActive]="'is-active'"
.Para un ejemplo con el enlace de navegación bootstrap 4:
fuente
Una instancia de la clase Router es en realidad un Observable y devuelve la ruta actual cada vez que cambia. Así es como lo hago:
Y luego en mi HTML:
fuente
Como se menciona en uno de los comentarios de la respuesta aceptada, la
routerLinkActive
directiva también se puede aplicar a un contenedor de la<a>
etiqueta real .Entonces, por ejemplo, con las pestañas Bootstrap de Twitter, donde la clase activa debe aplicarse a la
<li>
etiqueta que contiene el enlace:Con buena pinta ! Supongo que la directiva inspecciona el contenido de la etiqueta y busca una
<a>
etiqueta con larouterLink
directiva.fuente
La solución simple para los usuarios de angular 5 es simplemente agregar
routerLinkActive
al elemento de la lista.Una
routerLinkActive
directiva está asociada con una ruta a través de unarouterLink
directiva.Toma como entrada una matriz de clases que agregará al elemento al que está adjunto si su ruta está actualmente activa, de esta manera:
Lo anterior agregará una clase de activo a la etiqueta de ancla si actualmente estamos viendo la ruta de inicio.
fuente
Y en la última versión de angular, simplemente puede verificar
router.isActive(routeNameAsString)
. Por ejemplo, vea el siguiente ejemplo:Y asegúrese de no olvidarse de inyectar enrutador en su componente.
fuente
Estaba buscando una manera de usar un navegador de estilo Bootstrap de Twitter con Angular2, pero tuve problemas para
active
aplicar la clase al elemento padre del enlace seleccionado. ¡Descubrí que la solución de @ alex-correia-santos funciona perfectamente!El componente que contiene sus pestañas tiene que importar el enrutador y definirlo en su constructor antes de que pueda realizar las llamadas necesarias.
Aquí hay una versión simplificada de mi implementación ...
fuente
supongamos que desea agregar CSS a mi estado / pestaña activa. Use routerLinkActive para activar su enlace de enrutamiento.
nota: 'activo' es mi nombre de clase aquí
fuente
Estoy usando un enrutador angular
^3.4.7
y todavía tengo problemas con larouterLinkActive
directiva.No funciona si tiene varios enlaces con la misma URL, además no parece actualizarse todo el tiempo.
Inspirado por la respuesta de @tomaszbak, creé un pequeño componente para hacer el trabajo
fuente
La plantilla html pura será como
fuente
comience importando RouterLinkActive en sus archivos .ts
Ahora use RouterLinkActive en su HTML
proporcione algunos css a la clase "class_Name", ya que cuando este enlace esté activo / haga clic, encontrará esta clase en el intervalo durante la inspección.
fuente
Una forma programática sería hacerlo en el componente mismo. Tuve problemas durante tres semanas en este tema, pero me di por vencido en documentos angulares y leí el código real que hizo que routerlinkactive funcionara y eso es sobre los mejores documentos que puedo encontrar.
Nota :
Para la forma programática, asegúrese de agregar el enrutador-enlace y toma un elemento hijo. Si desea cambiar eso, debe deshacerse de los niños
superclass.nativeElement
.fuente