Q1 Suponha que eu queira alterar a aparência de cada "item" que um usuário marca para exclusão antes que o botão principal "excluir" seja pressionado. (Esse feedback visual imediato deve eliminar a necessidade da proverbial caixa de diálogo "você tem certeza?".) O usuário marcará as caixas de seleção para indicar quais itens devem ser excluídos. Se uma caixa de seleção estiver desmarcada, esse item deve voltar à sua aparência normal.
Qual é a melhor maneira de aplicar ou remover o estilo CSS?
Q2 Suponha que eu queira permitir que cada usuário personalize como meu site é apresentado. Por exemplo, selecione a partir de um conjunto fixo de tamanhos de fonte, permita cores de primeiro plano e plano de fundo definidas pelo usuário, etc.
Qual é a melhor maneira de aplicar o estilo CSS que o usuário seleciona / insere?
Respostas:
Angular fornece várias diretivas internas para manipular o estilo CSS condicional / dinamicamente:
A "maneira angular" normal envolve vincular uma propriedade de modelo / escopo a um elemento da interface do usuário que aceite entrada / manipulação do usuário (por exemplo, use o modelo ng) e, em seguida, associe essa propriedade de modelo a uma das diretivas internas mencionadas acima.
Quando o usuário altera a interface do usuário, o Angular atualiza automaticamente os elementos associados na página.
Q1 parece um bom argumento para a classe ng - o estilo CSS pode ser capturado em uma classe.
A classe ng aceita uma "expressão" que deve ser avaliada para um dos seguintes:
Supondo que seus itens sejam exibidos usando ng-repeat em algum modelo de matriz e que, quando a caixa de seleção de um item estiver marcada, você deseja aplicar a
pending-delete
classe:Acima, usamos a expressão de classe ng tipo 3 - um mapa / objeto de nomes de classe para valores booleanos.
O Q2 parece ser um bom argumento para o estilo ng - o estilo CSS é dinâmico, portanto não podemos definir uma classe para isso.
ng-style aceita uma "expressão" que deve ser avaliada para:
Para um exemplo artificial, suponha que o usuário possa digitar um nome de cor em uma caixa de texto para a cor de fundo (um seletor de cores do jQuery seria muito melhor):
Violino para ambos os itens acima.
O violino também contém um exemplo de ng-show e ng-hide . Se uma caixa de seleção estiver marcada, além da cor de fundo ficar rosa, algum texto será mostrado. Se 'vermelho' for inserido na caixa de texto, uma div ficará oculta.
fonte
Encontrei problemas ao aplicar classes dentro dos elementos da tabela quando já havia uma classe aplicada a toda a tabela (por exemplo, uma cor aplicada às linhas ímpares
<myClass tbody tr:nth-child(even) td>
). Parece que, quando você inspeciona o elemento com as Ferramentas do desenvolvedor , oelement.style
estilo não é atribuído. Então, em vez de usarng-class
, tentei usarng-style
e, nesse caso, o novo atributo CSS aparece dentroelement.style
. Este código funciona muito bem para mim:Myvar é o que estou avaliando e, em cada caso, aplico um estilo a cada um,
<td>
dependendo do valor myvar , que substitui o estilo atual aplicado pela classe CSS para toda a tabela.ATUALIZAR
Se você deseja aplicar uma classe à tabela, por exemplo, ao visitar uma página ou em outros casos, você pode usar esta estrutura:
Basicamente, o que precisamos para ativar uma classe ng é a classe a ser aplicada e uma declaração verdadeira ou falsa. True aplica a classe e false não. Portanto, temos aqui dois cheques da rota da página e um OR entre eles, por isso, se estamos em
/route_a
OR estamosroute_b
, o ativo será aplicado classe.Isso funciona apenas com uma função lógica à direita que retorna verdadeiro ou falso.
Portanto, no primeiro exemplo, o estilo ng é condicionado por três instruções. Se todos eles forem falsos, nenhum estilo será aplicado, mas, seguindo a nossa lógica, pelo menos um será aplicado; portanto, a expressão lógica verificará qual comparação de variáveis é verdadeira e, como uma matriz não vazia é sempre verdadeira, deixou uma matriz como retorno e com apenas uma verdadeira, considerando que estamos usando OR para toda a resposta, o estilo restante será aplicado.
A propósito, esqueci de fornecer a função isActive ():
NOVA ATUALIZAÇÃO
Aqui você tem algo que acho realmente útil. Quando você precisa aplicar uma classe dependendo do valor de uma variável, por exemplo, um ícone dependendo do conteúdo da
div
, você pode usar o seguinte código (muito útil emng-repeat
):fonte
Isso funciona bem quando a classe ng não pode ser usada (por exemplo, ao estilizar SVG):
(Eu acho que você precisa estar no mais recente Angular instável para usar ng-attr-, atualmente estou no 1.1.4)
Eu publiquei um artigo sobre como trabalhar com o AngularJS + SVG. Ele fala sobre esse assunto e vários outros. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS
fonte
ng-attr-
na página de diretivas , seção ngAttr atributo bindings .ng-class
não permite executar lógica, masng-attr-class
sim. Ambos têm seus usos, mas posso apostar que muitos desenvolvedores estarão procurandong-attr-class
.e código
css
fonte
Esta solução fez o truque para mim
fonte
Você pode usar expressão ternária. Existem duas maneiras de fazer isso:
ou...
fonte
Outra opção quando você precisa de um estilo css simples de uma ou duas propriedades:
Visão:
Controlador:
fonte
Veja o exemplo a seguir
fonte
A partir do AngularJS v1.2.0rc,
ng-class
e aténg-attr-class
falham com elementos SVG (eles funcionavam anteriormente, mesmo com ligação normal dentro do atributo de classe)Especificamente, nada disso funciona agora:
Como solução alternativa, eu tenho que usar
e depois estilize usando
fonte
Uma maneira mais (no futuro) de aplicar condicionalmente o estilo é criar condicionalmente o estilo com escopo
Atualmente, porém, apenas o FireFox suporta estilos de escopo.
fonte
Há mais uma opção que descobri recentemente que algumas pessoas podem achar úteis porque permite alterar uma regra CSS dentro de um elemento de estilo - evitando assim a necessidade de uso repetido de uma diretiva angular como ng-style, ng-class, ng-show, ng-hide, ng-animate e outros.
Esta opção faz uso de um serviço com variáveis de serviço que são definidas por um controlador e assistidas por uma diretiva de atributo que eu chamo de "estilo personalizado". Essa estratégia poderia ser usada de várias maneiras diferentes, e tentei fornecer algumas orientações gerais para esse violino .
fonte
Bem, eu sugiro que você verifique a condição no seu controlador com uma função retornando true ou false .
e no seu controlador verifique a condição
fonte
Uma coisa a observar é - se o estilo CSS tiver traços - você deve removê-los. Então, se você deseja definir
background-color
, a maneira correta é:fonte
Veja como eu apliquei condicionalmente o estilo de texto cinza em um botão desativado
Aqui está um exemplo de trabalho:
https://stackblitz.com/edit/example-conditional-disable-button?file=src%2Fapp%2Fapp.component.html
fonte