Q1. Supongamos que quiero alterar el aspecto de cada "elemento" que un usuario marca para su eliminación antes de presionar el botón principal "eliminar". (Esta retroalimentación visual inmediata debería eliminar la necesidad del proverbial cuadro de diálogo "¿estás seguro?"). El usuario marcará las casillas de verificación para indicar qué elementos se deben eliminar. Si una casilla de verificación no está marcada, ese elemento debería volver a su aspecto normal.
¿Cuál es la mejor manera de aplicar o eliminar el estilo CSS?
Q2 Supongamos que quiero permitir que cada usuario personalice cómo se presenta mi sitio. Por ejemplo, seleccione de un conjunto fijo de tamaños de fuente, permita colores de primer plano y fondo definibles por el usuario, etc.
¿Cuál es la mejor manera de aplicar el estilo CSS que el usuario selecciona / ingresa?
Respuestas:
Angular proporciona una serie de directivas integradas para manipular el estilo CSS de forma condicional / dinámica:
La "forma angular" normal implica vincular una propiedad de modelo / alcance a un elemento de la interfaz de usuario que acepte la entrada / manipulación del usuario (es decir, usar ng-model), y luego asociar esa propiedad de modelo a una de las directivas incorporadas mencionadas anteriormente.
Cuando el usuario cambia la IU, Angular actualizará automáticamente los elementos asociados en la página.
Q1 suena como un buen caso para ng-class: el estilo CSS se puede capturar en una clase.
ng-class acepta una "expresión" que debe evaluar uno de los siguientes:
Suponiendo que sus elementos se muestran usando ng-repeat sobre algún modelo de matriz, y que cuando se marca la casilla de verificación de un elemento, desea aplicar la
pending-delete
clase:Arriba, utilizamos el tipo de expresión ng-class # 3 - un mapa / objeto de nombres de clase a valores booleanos.
Q2 parece un buen caso para ng-style: el estilo CSS es dinámico, por lo que no podemos definir una clase para esto.
ng-style acepta una "expresión" que debe evaluar para:
Para un ejemplo artificial, suponga que el usuario puede escribir un nombre de color en un cuadro de texto para el color de fondo (un selector de color jQuery sería mucho mejor):
Violín para los dos anteriores.
El violín también contiene un ejemplo de ng-show y ng-hide . Si se marca una casilla de verificación, además del color de fondo que se vuelve rosa, se muestra algo de texto. Si se ingresa 'rojo' en el cuadro de texto, se oculta un div.
fuente
He encontrado problemas al aplicar clases dentro de elementos de tabla cuando ya tenía una clase aplicada a toda la tabla (por ejemplo, un color aplicado a las filas impares
<myClass tbody tr:nth-child(even) td>
). Parece que cuando inspecciona el elemento con Developer Tools ,element.style
no tiene estilo asignado. Entonces, en lugar de usarng-class
, he intentado usarng-style
, y en este caso, el nuevo atributo CSS aparece dentroelement.style
. Este código funciona muy bien para mí:Myvar es lo que estoy evaluando, y en cada caso aplico un estilo a cada uno
<td>
según el valor de myvar , que sobrescribe el estilo actual aplicado por la clase CSS para toda la tabla.ACTUALIZAR
Si desea aplicar una clase a la tabla, por ejemplo, al visitar una página o en otros casos, puede usar esta estructura:
Básicamente, lo que necesitamos para activar una clase ng es la clase a aplicar y una declaración verdadera o falsa. Verdadero aplica la clase y falso no. Así que aquí tenemos dos verificaciones de la ruta de la página y un OR entre ellas, por lo que si estamos en
/route_a
OR estamos enroute_b
, se aplicará la clase activa .Esto funciona simplemente teniendo una función lógica a la derecha que devuelve verdadero o falso.
Entonces, en el primer ejemplo, ng-style está condicionado por tres declaraciones. Si todos son falsos, no se aplica ningún estilo, pero siguiendo nuestra lógica, se aplicará al menos uno, por lo tanto, la expresión lógica verificará qué comparación de variables es verdadera y porque una matriz no vacía siempre es verdadera, eso será dejó una matriz como retorno y con solo un verdadero, considerando que estamos usando OR para toda la respuesta, se aplicará el estilo restante.
Por cierto, olvidé darle la función isActive ():
NUEVA ACTUALIZACIÓN
Aquí tienes algo que encuentro realmente útil. Cuando necesite aplicar una clase según el valor de una variable, por ejemplo, un icono según el contenido de la misma
div
, puede usar el siguiente código (muy útil enng-repeat
):fuente
Esto funciona bien cuando no se puede usar ng-class (por ejemplo, al diseñar SVG):
(Creo que necesitas estar en el último Angular inestable para usar ng-attr-, actualmente estoy en 1.1.4)
He publicado un artículo sobre cómo trabajar con AngularJS + SVG. Habla sobre este tema y muchos otros. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS
fuente
ng-attr-
en la página de directivas , sección enlaces de atributos ngAttr .ng-class
no te permite realizar la lógica, pero long-attr-class
hace. Ambos tienen sus usos, pero puedo apostar que muchos desarrolladores estarán buscandong-attr-class
.y código
css
fuente
Esta solución me sirvió.
fuente
Puedes usar expresiones ternarias. Hay dos maneras de hacer esto:
o...
fuente
Otra opción cuando necesita un estilo CSS simple de una o dos propiedades:
Ver:
Controlador:
fuente
Ver el siguiente ejemplo
fuente
A partir de AngularJS v1.2.0rc,
ng-class
e inclusong-attr-class
fallan con elementos SVG (funcionaron antes, incluso con un enlace normal dentro del atributo de clase)Específicamente, ninguno de estos funciona ahora:
Como solución alternativa, tengo que usar
y luego estilo usando
fuente
Una forma más (en el futuro) de aplicar estilo condicionalmente es creando un estilo con alcance
Pero hoy en día solo FireFox admite estilos con ámbito.
fuente
Hay una opción más que descubrí recientemente que algunas personas pueden encontrar útil porque le permite cambiar una regla CSS dentro de un elemento de estilo, evitando así la necesidad de uso repetido de una directiva angular como ng-style, ng-class, ng-show, ng-hide, ng-animate y otros.
Esta opción hace uso de un servicio con variables de servicio establecidas por un controlador y vigiladas por una directiva de atributos que llamo "estilo personalizado". Esta estrategia podría usarse de muchas maneras diferentes, e intenté proporcionar una guía general con este violín .
fuente
bueno, le sugiero que verifique la condición en su controlador con una función que devuelva verdadero o falso .
y en su controlador verifique la condición
fuente
Una cosa a tener en cuenta es que, si el estilo CSS tiene guiones, debe eliminarlos. Entonces, si desea configurar
background-color
, la forma correcta es:fuente
Así es como apliqué con estilo el estilo de texto gris en un botón deshabilitado
Aquí hay un ejemplo de trabajo:
https://stackblitz.com/edit/example-conditional-disable-button?file=src%2Fapp%2Fapp.component.html
fuente