O AngularJS ajuda de alguma forma na definição de uma active
classe no link da página atual?
Imagino que exista alguma maneira mágica de fazer isso, mas não consigo encontrar.
Meu menu se parece com:
<ul>
<li><a class="active" href="/tasks">Tasks</a>
<li><a href="/actions">Tasks</a>
</ul>
e tenho controladores para cada um deles em minhas rotas: TasksController
e ActionsController
.
Mas não consigo descobrir uma maneira de vincular a classe "ativa" nos a
links para os controladores.
Alguma dica?
ngClass="{active: isActive('/tasks')}
, ondeisActive()
retornaria um booleano, pois desacopla o controlador e a marcação / estilo.Sugiro usar uma diretiva em um link.
Mas ainda não é perfeito. Cuidado com os hashbangs;)
Aqui está o javascript para diretiva:
e aqui está como ele seria usado em html:
depois estilizando com css:
fonte
var path = $(element).children("a")[0].hash.substring(1);
. Isso funcionará para um 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;
paravar path = attrs.href||attrs.ngHref;
<li>
, pode mudarelement.addClass(clazz);
paraelement.parent().addClass(clazz);
Aqui está uma abordagem simples que funciona bem com o Angular.
Dentro do seu controlador AngularJS:
Este tópico possui várias outras respostas semelhantes.
Como definir a classe ativa bootstrap navbar com o Angular JS?
fonte
return viewLocation === $location.path()
Apenas para adicionar meus dois centavos no debate, criei um módulo angular puro (sem jQuery) e ele também funcionará com URLs de hash contendo dados. (por exemplo
#/this/is/path?this=is&some=data
)Você acabou de adicionar o módulo como uma dependência e
auto-active
a um dos ancestrais do menu. Como isso:E o módulo fica assim:
(Você pode, é claro, apenas usar a parte da diretiva)
Também vale a pena notar que isso não funciona para hashes vazios (por exemplo,
example.com/#
ou apenasexample.com
), ele precisa ter pelo menosexample.com/#/
ou apenasexample.com#/
. Mas isso acontece automaticamente com o ngResource e similares.E aqui está o violino: http://jsfiddle.net/gy2an/8/
fonte
No meu caso, resolvi esse problema criando um controlador simples responsável pela navegação
E apenas adicionando ng-class ao elemento da seguinte forma:
fonte
Para usuários do roteador AngularUI :
E isso colocará uma
active
classe no objeto selecionado.fonte
Existe uma
ng-class
diretiva que liga variável e classe css. Também aceita o objeto (className vs pares de valores booleanos).Aqui está o exemplo, http://plnkr.co/edit/SWZAqj
fonte
/test1/blahblah
ou será?active: activePath=='/test1'
retorna automaticamente um caminho "ativo" que começa com a string especificada? Isso é algum tipo de operador ou regex predefinido?==
verificações no html.A resposta de @ Renan-tomal-fernandes é boa, mas precisava de algumas melhorias para funcionar corretamente. Como sempre, ele sempre detectava o link para a página inicial (/) como acionado, mesmo se você estivesse em outra seção.
Então eu melhorei um pouco, aqui está o código. Eu trabalho com o Bootstrap para que a parte ativa esteja no
<li>
elemento em vez do<a>
.Controlador
Modelo
fonte
Aqui está a solução que eu encontrei depois de ler algumas das excelentes sugestões acima. Na minha situação específica, eu estava tentando usar o componente de guias do Bootstrap como menu, mas não queria usar a versão da interface do usuário angular porque quero que as guias funcionem como um menu, onde cada guia pode ser marcada como marcador, em vez das guias que atuam como navegação para uma única página. (Consulte http://angular-ui.github.io/bootstrap/#/tabs se você estiver interessado em saber como é a versão da interface do usuário angular das guias de inicialização).
Eu realmente gostei da resposta do kfis sobre a criação de sua própria diretiva para lidar com isso, no entanto, parecia complicado ter uma diretiva que precisava ser colocada em todos os links. Então, eu criei minha própria diretiva Angular, que é colocada uma vez na
ul
. Apenas no caso de alguém tentar fazer a mesma coisa, pensei em publicá-la aqui, embora, como disse, muitas das soluções acima também funcionem. Essa é uma solução um pouco mais complexa no que diz respeito ao javascript, mas cria um componente reutilizável com marcação mínima.Aqui está o javascript da diretiva e o provedor de rotas para
ng:view
:Então, no seu html, você simplesmente:
Aqui está o resultado: http://plnkr.co/edit/xwGtGqrT7kWoCKnGDHYN?p=preview .
fonte
Você pode implementar isso de maneira muito simples, aqui está um exemplo:
E seu controlador deve ser o seguinte:
fonte
use a diretiva ui-sref-active do angular-ui-router https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statename
fonte
Eu tive um problema semelhante com o menu localizado fora do escopo do controlador. Não tenho certeza se essa é a melhor solução ou a recomendada, mas é isso que funcionou para mim. Adicionei o seguinte à configuração do meu aplicativo:
Então, na visão, tenho:
fonte
Usando a versão 6 angular com o Bootstrap 4.1
Consegui fazê-lo como mostrado abaixo.
No exemplo abaixo, quando o URL vê '/ contact', o bootstrap ativo é adicionado à tag html. Quando o URL muda, ele é removido.
Leia mais no site da Angular
fonte
Usando uma diretiva (já que estamos manipulando o DOM aqui), o seguinte é provavelmente o mais próximo de fazer as coisas da "maneira angular":
Então o seu HTML ficaria assim:
fonte
menu-item
parece redundante em cada linha. Talvez anexar um atributo aoul
elemento (por exemplo<ul menu>
) seria melhor, mas não tenho certeza se isso seria possível.Eu fiz assim:
Isso permite que você tenha links em uma seção que possui diretiva track-active:
Essa abordagem parece muito mais limpa do que outras, para mim.
Além disso, se você estiver usando o jQuery, poderá torná-lo muito mais limpo, porque o jQlite possui apenas suporte básico ao seletor. Uma versão muito mais limpa com o jquery incluído antes da inclusão angular ficaria assim:
Aqui está um jsFiddle
fonte
Minha solução para esse problema, use
route.current
no modelo angular.Como você tem a
/tasks
rota para destacar em seu menu, você pode adicionar sua própria propriedademenuItem
às rotas declaradas pelo seu módulo:Em seu modelo,
tasks.html
você pode usar a seguinteng-class
diretiva:Na minha opinião, isso é muito mais limpo do que todas as soluções propostas.
fonte
Aqui está uma extensão da diretiva kfis que eu fiz para permitir diferentes níveis de correspondência de caminho. Essencialmente, achei a necessidade de corresponder caminhos de URL até uma certa profundidade, pois a correspondência exata não permite o aninhamento e o redirecionamento de estado padrão. Espero que isto ajude.
E aqui está como eu uso o link
Esta diretiva corresponderá ao nível de profundidade especificado no valor do atributo para a diretiva. Apenas significa que pode ser usado em outros lugares muitas vezes.
fonte
Aqui está mais uma diretiva para destacar links ativos.
Características principais:
Código:
Uso:
Exemplo simples com expressão angular, digamos $ scope.var = 2 , o link estará ativo se o local for / url / 2 :
Exemplo de bootstrap, li pai obterá a classe ativa:
Exemplo com URLs aninhados, o link estará ativo se algum URL aninhado estiver ativo (por exemplo, / url / 1 , / url / 2 , url / 1/2 / ... )
Exemplo complexo, o link aponta para um URL ( / url1 ), mas estará ativo se outro for selecionado ( / url2 ):
Exemplo com link desativado, se não estiver ativo, ele terá a classe 'disabled' :
Todos os atributos active-link- * podem ser usados em qualquer combinação, portanto condições muito complexas podem ser implementadas.
fonte
Se você deseja os links para a diretiva em um wrapper em vez de selecionar cada link individual (facilita a visualização do escopo no Batarang), isso também funciona muito bem:
A marcação seria apenas:
Também devo mencionar que estou usando jQuery 'full-fat' neste exemplo, mas você pode alterar facilmente o que fiz com a filtragem e assim por diante.
fonte
Aqui estão meus dois centavos, isso funciona muito bem.
NOTA: Isso não corresponde às páginas filho (que é o que eu precisava).
Visão:
Controlador:
fonte
De acordo com a resposta do @kfis, são comentários e minha recomendação, a diretiva final, conforme abaixo:
fonte
Para aqueles que usam ui-router, minha resposta é um pouco semelhante à do Ender2050, mas prefiro fazer isso através do teste de nome de estado:
HTML correspondente:
fonte
Nenhuma das sugestões da diretiva acima foi útil para mim. Se você possui uma barra de navegação de inicialização como esta
(que pode ser uma
$ yo angular
inicialização), você deseja adicionar.active
à lista de classes de elementos pai<li>
, não o próprio elemento; ie<li class="active">..</li>
. Então eu escrevi isso:uso
set-parent-active
;.active
é o padrão, portanto, não é necessário definire o
<li>
elemento pai será.active
quando o link estiver ativo. Para usar uma.active
classe alternativa como.highlight
, simplesmentefonte
O mais importante para mim foi não alterar o código padrão de auto-inicialização. Aqui é o meu controlador de menu que procura por opções de menu e depois adiciona o comportamento que queremos.
fonte
teve o mesmo problema. Aqui está a minha solução :
fonte
Acabei de escrever uma diretiva para isso.
Uso:
Implementação:
Testes:
fonte
O percurso:
O menu html:
O controlador:
O problema que encontrei aqui é que o item de menu está ativo apenas quando a página inteira é carregada. Quando a vista parcial é carregada, o menu não muda. Alguém sabe por que isso acontece?
fonte
fonte
Encontrei a solução mais fácil. apenas para comparar indexOf em HTML
fonte