Digamos que tiene una matriz que se representa en un ul
con un li
para cada elemento y una propiedad en el controlador llamado selectedIndex
. ¿Cuál sería la mejor manera de agregar una clase al li
con el índice selectedIndex
en AngularJS?
Actualmente estoy duplicando (a mano) el li
código y agregando la clase a una de las li
etiquetas y usando ng-show
y ng-hide
para mostrar solo una li
por índice.
Respuestas:
Si no desea poner nombres de clase CSS en el controlador como lo hago yo, aquí hay un viejo truco que uso desde los días anteriores a v1. Podemos escribir una expresión que evalúe directamente a un nombre de clase seleccionado , no se necesitan directivas personalizadas:
Tenga en cuenta la sintaxis anterior con dos puntos.
También hay una nueva forma mejor de aplicar clases condicionalmente, como:
Angular ahora admite expresiones que devuelven un objeto. Cada propiedad (nombre) de este objeto ahora se considera como un nombre de clase y se aplica según su valor.
Sin embargo, estas formas no son funcionalmente iguales. Aquí hay un ejemplo:
Por lo tanto, podríamos reutilizar las clases CSS existentes básicamente mapeando una propiedad de modelo a un nombre de clase y al mismo tiempo mantener las clases CSS fuera del código del controlador.
fuente
($index==selectedIndex) ? 'selected' : ''
?{classname: '$index === selectedIndex'}
y no funcionaba. Cuando puse todo junto y usé == en lugar de === funcionó.{classname: '$index==selectedIndex'}
ng-class admite una expresión que debe evaluarse para
Entonces, usando el formulario 3) simplemente podemos escribir
Consulte también ¿Cómo aplico condicionalmente estilos CSS en AngularJS? para una respuesta más amplia
Actualización : Angular 1.1.5 ha agregado soporte para un operador ternario , por lo que si esa construcción te resulta más familiar:
fuente
ng-class="{'selected': $index==selectedIndex}"
funciona para míMi método favorito es usar la expresión ternaria.
Nota: en caso de que estés usando una versión anterior de Angular, deberías usar esto en su lugar,
fuente
ng-class="property.name=='timestamp' ? 'property-timestamp' : 'property-'+{{$index}}"
. No podría encontrar otra forma.Agregaré a esto, porque algunas de estas respuestas parecen desactualizadas. Así es como lo hago:
Donde 'isSelected' es una variable de JavaScript definida dentro del controlador angular con ámbito.
Para abordar más específicamente su pregunta, así es como puede generar una lista con eso:
HTML
JS
Ver: http://jsfiddle.net/tTfWM/
Ver: http://docs.angularjs.org/api/ng.directive:ngClass
fuente
ng-class:className
vs solo el usoclass="{{className}}"
?Aquí hay una solución mucho más simple:
fuente
Recientemente me enfrenté a un problema similar y decidí crear un filtro condicional:
Se necesita un solo argumento, que es una matriz de 2 elementos o una cadena, que se convierte en una matriz que se agrega una cadena vacía como el segundo elemento:
fuente
filter('yesNo', function() { return function(input) { // info('yesNo('+ input +')'); switch(input){ case '1': return ' yes '; break; default: return ' no '; break; } } });
Si desea ir más allá de la evaluación binaria y mantener su CSS fuera de su controlador, puede implementar un filtro simple que evalúe la entrada contra un objeto de mapa:
Esto le permite escribir su marcado de esta manera:
fuente
Lo que hice recientemente fue hacer esto:
El
isShowing
valor es un valor que se encuentra en mi controlador que se alterna con el clic de un botón y las partes entre paréntesis individuales son clases que creé en mi archivo css.EDITAR: También me gustaría agregar que codeschool.com tiene un curso gratuito patrocinado por google en AngularJS que repasa todo esto y algo más. No hay necesidad de pagar por nada, ¡simplemente regístrese para obtener una cuenta y comience! ¡La mejor de las suertes para todos ustedes!
fuente
isShowing
Entonces hay una matriz en el controlador?El operador ternario se acaba de agregar al analizador angular en 1.1.5 .
Entonces, la forma más sencilla de hacer esto es ahora:
fuente
class="otherClass ng-class:($index==selectedIndex)? 'selected' : '';"
.Podemos hacer una función para gestionar la clase de retorno con condición
Y entonces
Puede consultar la página de códigos completa en ng-class si es un ejemplo
fuente
Soy nuevo en Angular pero he encontrado esto para resolver mi problema:
Esto aplicará condicionalmente una clase basada en una var. Comienza con una descarga de iconos por defecto, usando ng-class, verifico el estado de
showDetails
iftrue/false
y aplico la carga de iconos de clase . Funciona muy bien.Espero eso ayude.
fuente
Esto funciona como un encanto;)
fuente
Probablemente, esto se reducirá al olvido, pero así es como utilicé los operadores ternarios de 1.1.5 para cambiar de clase dependiendo de si una fila en una tabla es la primera, la media o la última, excepto si solo hay una fila en la tabla:
fuente
Esto está en mi trabajo juzgar condicionalmente múltiples:
fuente
Aquí hay otra opción que 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)
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
parcial
controlador
fuente
Si está utilizando angular pre v1.1.5 (es decir, sin operador ternario) y aún desea una forma equivalente de establecer un valor en ambas condiciones, puede hacer algo como esto:
fuente
Si tiene una clase común que se aplica a muchos elementos, puede crear una directiva personalizada que agregará esa clase como ng-show / ng-hide.
Esta directiva agregará la clase 'activa' al botón si se hace clic en ella
Más información
fuente
Solo agregué algo que funcionó para mí hoy, después de mucho buscar ...
Espero que esto ayude en su desarrollo exitoso.
=)
Sintaxis de Expresión Indocumentada: Gran Enlace al Sitio Web ... =)
fuente
Mira esto .
¡La infame
if|else
declaración de AngularJS !Cuando comencé a usar Angularjs, me sorprendió un poco que no pudiera encontrar una declaración if / else.
Así que estaba trabajando en un proyecto y noté que al usar la instrucción if / else, la condición se muestra mientras se carga. Puedes usar ng-cloak para arreglar esto.
.ng-cloak { display: none }
Gracias amadou
fuente
Puedes usar este paquete npm. Maneja todo y tiene opciones para clases estáticas y condicionales basadas en una variable o una función.
fuente