OBSERVAÇÃO: Existem muitas respostas diferentes aqui e a maioria foi válida uma vez ou outra. O fato é que o que funciona mudou várias vezes, pois a equipe do Angular mudou seu roteador. A versão do roteador 3.0, que eventualmente será o roteador no Angular, quebra muitas dessas soluções, mas oferece uma solução muito simples. A partir do RC.3, a solução preferida é usar [routerLinkActive]
como mostrado nesta resposta .
Em um aplicativo Angular (atual na versão 2.0.0-beta.0 enquanto escrevo isso), como você determina qual é a rota atualmente ativa?
Estou trabalhando em um aplicativo que usa o Bootstrap 4 e preciso marcar os links / botões de navegação como ativos quando o componente associado estiver sendo mostrado em uma <router-output>
tag.
Percebo que eu mesmo poderia manter o estado quando um dos botões é clicado, mas isso não abrangeria o caso de ter vários caminhos na mesma rota (por exemplo, um menu de navegação principal e um menu local no componente principal )
Todas as sugestões ou links serão apreciados. Obrigado.
fonte
@input
opções for, masexact: false
ativa a classe sempre que os irmãos da rota atual também estiverem ativos.router.navigate()
funcionaria bem.routerLinkActive
é simplesmente um indicador de se esse link representa a rota ativa.Eu respondi isso em outra pergunta, mas acredito que possa ser relevante para essa também. Aqui está um link para a resposta original: Angular 2: Como determinar a rota ativa com parâmetros?
Eu tenho tentado definir a classe ativa sem ter que saber exatamente qual é o local atual (usando o nome da rota) . A melhor solução que tenho até agora é usar a função isRouteActive disponível na
Router
classe.router.isRouteActive(instruction): Boolean
pega um parâmetro que é umInstruction
objeto de rota e retornatrue
oufalse
se essa instrução é verdadeira ou não para a rota atual. Você pode gerar uma rotaInstruction
usandoRouter
o comando generate (linkParams: Array) . LinkParams segue exatamente o mesmo formato que um valor passado para uma diretiva routerLink (por exemplorouter.isRouteActive(router.generate(['/User', { user: user.id }]))
).É assim que o RouteConfig pode se parecer (eu o aprimorei um pouco para mostrar o uso de parâmetros) :
E o View ficaria assim:
Esta tem sido a minha solução preferida para o problema até agora, pode ser útil para você também.
fonte
router.isRouteActive('Home')
.Router
no construtor de classename
vez doas
objeto de configuração do roteador.router.urlTree.contains(router.createUrlTree(['Home']))
Resolvi um problema encontrado neste link e descobri que há uma solução simples para sua pergunta. Você poderia usar
router-link-active
em seus estilos.fonte
router-link-active
classe não está sendo adicionada ao ativoa
ouli
. mas há um lugar em que estou usando o bootstrapnav-tabs
e ele funciona lá.Pequena melhoria na resposta @ alex-correia-santos com base em https://github.com/angular/angular/pull/6407#issuecomment-190179875
E use-o assim:
fonte
styles : [
.active {background-color: aliceblue; }]
. +1 funcionaVocê pode verificar a rota atual injetando o
Location
objeto no seu controlador e verificando o seguintepath()
:Você precisará importá-lo primeiro:
Você pode usar uma expressão regular para corresponder ao caminho retornado para ver qual rota está ativa. Observe que a
Location
classe retorna um caminho normalizado, independentemente do queLocationStrategy
você está usando. Portanto, mesmo se você estiver usandoHashLocationStragegy
os caminhos retornados, ainda estará no formato/foo/bar
não#/foo/bar
fonte
UPDATE: atualizado conforme Angular2.4.x
ver mais...
fonte
Para marcar rotas ativas,
routerLinkActive
pode ser usadoIsso também funciona em outros elementos como
Se correspondências parciais também devem ser marcadas, use
Até onde eu sei,
exact: false
será o padrão no RC.4fonte
No momento, estou usando o rc.4 com o bootstrap 4 e este funciona perfeito para mim:
Isso funcionará para o URL: / home
fonte
/home/whatever
?exact
quer dizer, essa rota terá o mesmo nome. E isso é necessário se você planeja usá-lo com ferramentas como a inicialização do twitter. Ele já manipula o estado do link ativo e, sem aexact
opção, não funciona. (não tenho certeza sobre como ele funciona no núcleo, eu era experimentar e trabalhar para mim)Abaixo está o método usando RouteData para estilizar itens menuBar, dependendo da rota atual:
RouteConfig inclui dados com guia (rota atual):
Um pedaço de layout:
Classe:
fonte
Apenas pensei em adicionar um exemplo que não usa nenhum tipo de texto:
A
routerLinkActive
variável é vinculada a uma variável de modelo e, em seguida, reutilizada conforme necessário. Infelizmente, a única ressalva é que você não pode ter tudo isso no<section>
elemento, pois#home
precisa ser resolvido antes da execução do analisador<section>
.fonte
Router
no Angular 2 RC não define maisisRouteActive
egenerate
métodos.Tente seguir
aviso,
routeSegment : RouteSegment
deve ser injetado no construtor do componente.fonte
Aqui está um exemplo completo para adicionar estilo de rota ativo na versão Angular,
2.0.0-rc.1
que leva em consideração caminhos raiz nulos (por exemplopath: '/'
)app.component.ts -> Rotas
app.component.html
fonte
Solução para Angular2 RC 4:
fonte
A partir do Angular 8, isso funciona:
{ exact: true }
garante que ele corresponda ao URL.fonte
em 2020, se você quiser definir a classe ativa no elemento que não possui [routerLink] - você pode fazer simplesmente:
fonte
Outra solução alternativa. Muito mais fácil no Angular Router V3 Alpha. injetando o roteador
uso
fonte
No Angular2 RC2, você pode usar esta implementação simples
isso adicionará classe
active
ao elemento com o URL correspondente, leia mais aquifonte
Abaixo estão as respostas para esta pergunta para todas as versões do Angular 2 RC lançadas até a data:
RC4 e RC3 :
Para aplicar a classe ao link ou ancestral do link:
/ home deve ser a URL e não o nome da rota, pois a propriedade name não existe mais no objeto de rota a partir do roteador v3.
Mais sobre a diretiva routerLinkActive neste link .
Para aplicar classe a qualquer div com base na rota atual:
por exemplo
RC2 e RC1 :
Use a combinação de router.isRouteActive e classe. *. por exemplo, para aplicar a classe ativa com base na rota doméstica.
Nome e URL podem ser passados para router.generate.
fonte
O uso
routerLinkActive
é bom em casos simples, quando há um link e você deseja aplicar algumas classes. Mas em casos mais complexos em que você pode não ter um routerLink ou em que precisa de algo mais, pode criar e usar um canal :então:
e não se esqueça de incluir pipe nas dependências de pipes;)
fonte
containsTree
definido?Para a versão Angular 4+, você não precisa usar nenhuma solução complexa. Você pode simplesmente usar
[routerLinkActive]="'is-active'"
.Por exemplo, com o link de navegação bootstrap 4:
fonte
Uma instância da classe Router é realmente um Observable e retorna o caminho atual toda vez que muda. É assim que eu faço:
E então no meu HTML:
fonte
Conforme mencionado em um dos comentários da resposta aceita, a
routerLinkActive
diretiva também pode ser aplicada a um contêiner da<a>
tag real .Por exemplo, nas guias do Twitter Bootstrap, em que a classe ativa deve ser aplicada à
<li>
tag que contém o link:Muito arrumado ! Suponho que a diretiva inspecione o conteúdo da tag e procure uma
<a>
tag com arouterLink
diretiva.fonte
A solução simples para 5 usuários angulares é apenas adicionar
routerLinkActive
ao item da lista.Uma
routerLinkActive
diretiva está associada a uma rota através de umrouterLink
diretiva.Ele assume como entrada uma matriz de classes que será adicionada ao elemento ao qual está anexado se sua rota estiver ativa no momento, da seguinte forma:
O item acima adicionará uma classe de ativo à marca de âncora, se estivermos visualizando a rota inicial.
fonte
E na versão mais recente do angular, você pode simplesmente verificar
router.isActive(routeNameAsString)
. Por exemplo, veja o exemplo abaixo:E certifique-se de não esquecer o roteador de injeção no seu componente.
fonte
Eu estava procurando uma maneira de usar uma navegação no estilo Bootstrap do Twitter com o Angular2, mas tive problemas para obter o
active
para aplicar classe ao elemento pai do link selecionado. Verificou que a solução de @ alex-correia-santos funciona perfeitamente!O componente que contém suas guias deve importar o roteador e defini-lo em seu construtor antes que você possa fazer as chamadas necessárias.
Aqui está uma versão simplificada da minha implementação ...
fonte
digamos que você queira adicionar CSS ao meu estado / guia ativo. Use routerLinkActive para ativar seu link de roteamento.
nota: 'ativo' é o nome da minha classe aqui
fonte
Estou usando roteador angular
^3.4.7
e ainda estou tendo problemas com arouterLinkActive
diretiva.Não está funcionando se você tiver vários links com o mesmo URL, além de não parecer atualizado o tempo todo.
Inspirado pela resposta @tomaszbak, criei um pequeno componente para fazer o trabalho
fonte
Modelo de HTML puro ser como
fonte
comece com a importação do RouterLinkActive no seu .ts
Agora use RouterLinkActive no seu HTML
forneça algum css para a classe "class_Name", pois quando este link estiver ativo / clicado, você encontrará essa classe em extensão durante a inspeção.
fonte
Uma maneira programática seria fazê-lo no próprio componente. Eu lutei três semanas nessa questão, mas desisti de documentos angulares e li o código real que fazia o trabalho de linklink do roteador ser um dos melhores documentos que posso encontrar.
Nota :
Pela maneira programática, certifique-se de adicionar o link do roteador e é necessário um elemento filho. Se você quer mudar isso, precisa se livrar das crianças
superclass.nativeElement
.fonte