No Angular (e em geral), sou um grande fã de manter a lógica de visualização fora dos meus controladores, e um lugar onde vejo que isso não está acontecendo são as classes CSS e o uso da classe ng.
Se você não estiver familiarizado com ng-class, é uma diretiva especial para permitir vinculação de expressões e colocá-las como, sim, a classe de um elemento. Um uso muito comum da classe ng é mais ou menos assim:
<p ng-class="{{active}}">Class applied!</p>
<script>
function MySimpleCtrl() {
$scope.active = 'active';
...
Portanto, no controlador, estamos definindo a classe particular que deve ser exibida; então digamos que temos uma classe ‘inativa’ – simplesmente definimos a variável $ scope.active como ‘inactive’ e voila, a classe é definida na visualização.
Mas ng-class é ainda mais inteligente do que isso:
ng-class aceita três tipos diferentes de valor:
- Um valor de string (nome da classe)
- Uma matriz de strings (classes a serem aplicadas)
- Um objeto + expressão para avaliar
E é a opção 3 que interessa; a sintaxe é mais ou menos assim:
ng-class="{object of key/value pairs}[expression to evaluate]"
Basicamente, ng-class avalia a expressão (entre colchetes) e a usa como chave para o objeto; o valor ao qual a chave está relacionada é a classe que se aplica.
Isso nos permite transformar o valor em um booleano real (que é realmente como o estamos usando) – sem lógica de visão nos controladores, os controladores são mais fáceis de testar e podem ser reutilizados.$scope.active
Aqui está um exemplo simples:
<p ng-class="{true: 'active', false: 'inactive'}[isActive]">
Class applied
!</p>
<script>
function MySimpleCtrl() {
$scope.isActive = true;
E você pode ver isso funcionando neste JSFiddle
Se estiver usando algum tipo de conjunto de expressões condicionais (ou seja, alterna), você pode usar outra sintaxe muito semelhante, como esta:
ng-class="{'selected': isSelected, 'blue': isBlue}"
Aqui a selected
classe será aplicada se isSelected
for verdadeira. O mesmo acontece com a blue
classe. O Angular aplicará tantos daqueles que forem verdadeiros, então você pode definir a classe como selecionada e azul.