Como detectar o estado atual dentro da diretiva

86

Estou usando o roteamento do AngularUI e gostaria de fazer um, ng-class="{active: current.state}"mas não tenho certeza de como detectar exatamente o estado atual em uma diretiva como esta.

Webnet
fonte

Respostas:

115

Além disso, você pode usar a diretiva ui-sref-active :

<ul>
  <li ui-sref-active="active" class="item">
    <a href ui-sref="app.user({user: 'bilbobaggins'})">@bilbobaggins</a>
  </li>
  <!-- ... -->
</ul>

Ou filtros: "stateName" | isState&"stateName" | includedByState

darthwade
fonte
146

Atualizar:

Esta resposta foi para uma versão muito mais antiga do Ui-Router. Para as versões mais recentes (0.2.5+), use a diretiva helper ui-sref-active. Detalhes aqui .


Resposta Original:

Inclua o serviço $ state em seu controlador. Você pode atribuir este serviço a uma propriedade em seu escopo.

Um exemplo:

$scope.$state = $state;

Em seguida, para obter o estado atual em seus modelos:

$state.current.name

Para verificar se um estado está ativo no momento:

$state.includes('stateName'); 

Este método retorna verdadeiro se o estado estiver incluído, mesmo se fizer parte de um estado aninhado. Se você estivesse em um estado aninhado user.details, e verificasse $state.includes('user'), ele retornaria verdadeiro.

Em seu exemplo de classe, você faria algo assim:

ng-class="{active: $state.includes('stateName')}"
Cuong Vo
fonte
3
E para estados que possuem parâmetros?
Bradley Trager
25

Se você estiver usando ui-router, tente $ state.is ();

Você pode usá-lo assim:

$state.is('stateName');

Pela documentação:

$ state.is ... semelhante a $ state.includes, mas verifica apenas o nome completo do estado.

Clement Hoang
fonte
1

O uso da diretiva ui-sref-active que funcionou para mim foi:

<li ui-sref-active="{'active': 'admin'}">
    <a ui-sref="admin.users">Administration Panel</a>
</li>

como encontrado aqui sob o comentário rotulado como "tgrant59 comentou em 31 de maio de 2016".

Estou usando o angular-ui-router v0.3.1.

Jaycer
fonte