Se eu tiver uma barra de navegação no bootstrap com os itens
Home | About | Contact
Como defino a classe ativa para cada item de menu quando eles estão ativos? Ou seja, como posso definir class="active"
quando a rota angular está em
#/
para casa#/about
para a página sobre#/contact
para a página de contato
javascript
twitter-bootstrap
angularjs
angularjs-directive
navbar
user1876508
fonte
fonte
Respostas:
Uma maneira muito elegante é usar o ng-controller para executar um único controller fora da ng-view:
e inclua no controllers.js:
fonte
return $location.path().indexOf(viewLocation) == 0;
em vez de modo que você pode pegar páginas com parâmetros bemelegant
- o nome da rota, por exemplo,/dogs
precisa ser duplicado na chamada paraisActive('/dogs')
ui-sref-active/ui-sref-active-eq
diretivas, por exemplo.ui-sref-active-eq='active'
ouui-sref-active='active'
para alcançar os mesmos resultadosAcabei de escrever uma diretiva para lidar com isso, para que você possa simplesmente adicionar o atributo
bs-active-link
ao<ul>
elemento pai e, sempre que a rota for alterada, ele encontrará o link correspondente e adicionará aactive
classe ao correspondente<li>
.Você pode vê-lo em ação aqui: http://jsfiddle.net/8mcedv3b/
Exemplo de HTML:
Javascript:
fonte
Você pode dar uma olhada no AngularStrap , a diretiva navbar parece ser o que você está procurando:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
Para usar esta diretiva:
Faça o download do AngularStrap em http://mgcrea.github.io/angular-strap/
Inclua o script na sua página após o bootstrap.js:
<script src="lib/angular-strap.js"></script>
Adicione as diretrizes ao seu módulo:
angular.module('myApp', ['$strap.directives'])
Adicione a diretiva à sua barra de navegação:
<div class="navbar" bs-navbar>
Adicione expressões regulares em cada item de navegação:
<li data-match-route="/about"><a href="#/about">About</a></li>
fonte
scope.$watch
)element
variável é passada para o seletor jquery?$('...', element)
mgcrea.ngStrap
não$strap.directives
Aqui está uma abordagem simples que funciona bem com o Angular.
Dentro do seu controlador AngularJS:
fonte
Se você estiver trabalhando com roteador Angular, a diretiva RouterLinkActive pode ser usada de maneira muito elegante:
fonte
active
classe deve estar no<li>
(você pode colocar o routerLinkActive com o routerLink ou seu pai)/
como sua página inicial,routerLinkActive
considerará ativo para qualquer URL que comece com/
, por exemplo/foo/
,/foo/bar
etc. Para corresponder exatamente, você precisarouterLinkActive="active" [routerLinkActiveOptions]="{exact:true}"
.Em primeiro lugar, esse problema pode ser resolvido de várias maneiras. Dessa forma, pode não ser o mais elegante, mas certamente funciona.
Aqui está uma solução simples que você deve poder adicionar a qualquer projeto. Você pode simplesmente adicionar uma "pageKey" ou alguma outra propriedade ao configurar sua rota que pode ser usada para desativar. Além disso, você pode implementar um ouvinte no método $ routeChangeSuccess do objeto $ route para ouvir a conclusão bem-sucedida de uma alteração de rota.
Quando o manipulador é acionado, você obtém a chave da página e usa essa chave para localizar elementos que precisam ser "ATIVOS" para esta página e aplica a classe ACTIVE.
Lembre-se de que você precisa de uma maneira de tornar TODOS os elementos "ATIVOS". Como você pode ver, estou usando a classe .pageKey nos meus itens de navegação para desativá-los, e estou usando o .pageKey_ {PAGEKEY} para ativá-los individualmente. Mudar todos eles para inativos seria considerado uma abordagem ingênua; potencialmente, você obteria melhor desempenho usando a rota anterior para desativar apenas os itens ativos ou alterar o seletor de jquery para selecionar apenas os itens ativos a serem desativados. Usar o jquery para selecionar todos os itens ativos é provavelmente a melhor solução, pois garante que tudo esteja limpo para a rota atual no caso de qualquer erro de CSS que possa estar presente na rota anterior.
O que significaria alterar essa linha de código:
para este
Aqui está um exemplo de código:
Dada uma barra de navegação de auto-inicialização de
E um módulo angular e um controlador como o seguinte:
fonte
Você pode realmente usar angular ui-utils '
ui-route
directiva:ou:
Controlador de cabeçalho
Página de índice
Se você estiver usando ui-utils, também poderá estar interessado no ui-router para gerenciar visualizações parciais / aninhadas.
fonte
Acho todas essas respostas um pouco mais complicadas para mim, desculpe. Então, eu criei uma pequena diretiva que deve funcionar com base na barra de navegação:
Uso:
fonte
Eu uso a diretiva de classe ng com $ location para alcançá-lo.
Requer que a barra de navegação esteja dentro de um Controlador principal com acesso ao serviço $ location como este:
fonte
Você pode conseguir isso com uma condicional em uma expressão angular, como:
Dito isto, acho que uma diretiva angular é a maneira mais "adequada" de fazê-lo, embora a terceirização de grande parte dessa minilógica possa poluir um pouco sua base de código.
Uso condicionais para estilizar a GUI de vez em quando durante o desenvolvimento, porque é um pouco mais rápido que a criação de diretivas. Não pude contar uma instância em que eles realmente permaneceram na base de código por muito tempo. No final, eu a transformo em uma diretiva ou encontro uma maneira melhor de resolver o problema.
fonte
Se você usa o ui-router , o exemplo a seguir deve satisfazer suas necessidades com base no comentário do @ DanPantry na resposta aceita sem adicionar nenhum código do lado do controlador:
Você pode verificar os documentos para obter mais informações.
fonte
ui.router
!Se você preferir não usar o AngularStrap , esta diretiva deve funcionar! Esta é uma modificação de https://stackoverflow.com/a/16231859/910764 .
Javascript
HTML
Nota: As classes HTML acima assumem que você está usando o Bootstrap 3.x
fonte
Aqui está minha opinião sobre isso. Um pouco de uma combinação de respostas encontradas neste post. Como eu tinha um caso um pouco diferente, minha solução envolve separar o menu em seu próprio modelo para ser usado no Objetivo de Definição de Diretiva e adicionar minha barra de navegação à página em que eu precisava. Basicamente, eu tinha uma página de login na qual não queria incluir meu menu; portanto, usei ngInclude e insiro essa diretiva ao efetuar o login:
DIRETIVA:
MODELO DIRETO (templates / menu.html)
HTML QUE INCLUI A DIRETIVA
Espero que isto ajude
fonte
Estendendo minha resposta, eu precisava disso para lidar com uma estrutura como esta.
-índice
-events <-ativo
--- lista de
eventos
--- edição de eventos --- mapa de eventos <-clicado
-places
--- lista
-de
-lugar --- edição-de -lugar --- mapa-de-lugar
então, em vez de fazer a correspondência, eu tive que usar o indexOf para validar links filhos formatados para corresponder à condição. Assim, para 'eventos':
fonte
Esta é uma solução simples
fonte
Em conjunto com a resposta AngularStrap do @ Olivier, também implementei a resposta do kevinknelson em: https://github.com/twbs/bootstrap/issues/9013 .
Nativamente, a barra de navegação do Bootstrap3 não foi projetada para um aplicativo de página única (por exemplo, Angular) e, portanto, o menu quando em uma tela pequena não estava desmoronando ao clicar.
fonte
Javascript
HTML
fonte
Graças a @Pylinux . Eu usei a técnica dele e também a modifiquei para dar suporte a "um" nível do menu suspenso (sub ul / li), pois era disso que eu precisava. Veja-o em ação no link do violino abaixo.
Fiddle atualizado com base na resposta do pylinux - http://jsfiddle.net/abhatia/en4qxw6g/
Fiz as três alterações a seguir, para oferecer suporte a um nível no menu suspenso:
1. Adicionado um valor de classe dd (menu suspenso) para o elemento "a" em li, que precisa ter uma lista de sub ul.
2. Javascript atualizado para adicionar a nova lógica a seguir.
3. CSS atualizado para adicionar o seguinte:
Esperamos que isso seja útil para quem procura implementar o menu suspenso de nível único.
fonte
Use um objeto como uma variável de opção.
Você pode fazer isso de forma simples com:
Cada vez que você clica em um link, o objeto do comutador é substituído por um novo objeto em que apenas a propriedade correta do objeto do comutador é verdadeira. As propriedades indefinidas serão avaliadas como falsas e, portanto, os elementos que dependem delas não terão a classe ativa atribuída.
fonte
Você também pode usar esta diretiva de link ativo https://stackoverflow.com/a/23138152/1387163
A li principal receberá classe ativa quando o local corresponder / url :
fonte
Sugiro usar uma diretiva em um link. Aqui está o violino.
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
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. ( ig
#/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 ( ig
example.com/#
ou apenasexample.com
) que ele precisa ter pelo menosexample.com/#/
ou apenasexample.com#/
. Mas isso acontece automaticamente com o ngResource e similares.fonte
Isso fez o truque para mim:
então você usa jquery (funciona com angular também) para adicionar classe ativa
e, claro, o css:
isso funciona se você tiver seu html assim:
isso adiciona atumaticamente a classe ativa usando o URL da página e cor o fundo como vermelho se você estiver em www.somesite.com/ee thaen ee é o 'aplicativo' e estará ativo
fonte
Isso é respondido há muito tempo, mas pensei em compartilhar meu caminho:
Modelo:
Para aqueles que usam
ui-router
:Para correspondência exata (por exemplo, estados aninhados?), Use
$state.name === 'full/path/to/state'
ouui-sref-active-eq="active"
fonte
Aqui está outra solução para quem possa estar interessado. A vantagem disso é que ele tem menos dependências. Heck, ele funciona sem um servidor web também. Portanto, é completamente do lado do cliente.
HTML:
Explicação:
Aqui estamos gerando as ligações dinamicamente a partir de um modelo AngularJS usando a diretiva
ng-repeat
. A mágica acontece com os métodosselectTab()
egetTabClass()
definidos no controlador para esta barra de navegação apresentada abaixo.Controlador:
Explicação:
selectTab()
O método é chamado usandong-click
diretiva. Então, quando o link é clicado, a variávelselectedTab
é definida como o nome desse link. No HTML, você pode ver que esse método é chamado sem nenhum argumento para a guia Página inicial, para que seja destacado quando a página for carregada.O
getTabClass()
método é chamado viang-class
diretiva no HTML. Este método verifica se a guia em que está é igual ao valor daselectedTab
variável. Se verdadeiro, ele retorna "active" else else "", que é aplicado como o nome da classe pelang-class
diretiva. Então, qualquer que seja o css que você aplicou à classeactive
será aplicado à guia selecionada.fonte
Você precisará adicionar a
active
classe necessária com o código de cores necessário.Ex:
ng-class="{'active': currentNavSelected}" ng-click="setNav"
fonte