Disons que vous avez un tableau qui est rendu dans un ul
avec un li
pour chaque élément et une propriété sur le contrôleur appelé selectedIndex
. Quelle serait la meilleure façon d'ajouter une classe à li
l'index selectedIndex
dans AngularJS?
Je suis en train de dupliquer (à la main) le li
code et d'ajouter la classe à l'une des li
balises et d'utiliser ng-show
et ng-hide
d'afficher une seule li
par index.
Réponses:
Si vous ne voulez pas mettre les noms de classe CSS dans Controller comme je le fais, voici une vieille astuce que j'utilise depuis les jours antérieurs à la v1. Nous pouvons écrire une expression qui évalue directement un nom de classe sélectionné , aucune directive personnalisée n'est nécessaire:
Veuillez noter l'ancienne syntaxe avec deux points.
Il existe également une nouvelle meilleure façon d'appliquer les classes de manière conditionnelle, comme:
Angular prend désormais en charge les expressions qui renvoient un objet. Chaque propriété (nom) de cet objet est désormais considérée comme un nom de classe et est appliquée en fonction de sa valeur.
Cependant, ces façons ne sont pas fonctionnellement égales. Voici un exemple:
Nous pourrions donc réutiliser les classes CSS existantes en mappant fondamentalement une propriété de modèle à un nom de classe et en même temps garder les classes CSS hors du code du contrôleur.
la source
($index==selectedIndex) ? 'selected' : ''
?{classname: '$index === selectedIndex'}
et ça ne fonctionnait pas. Quand j'ai tout rassemblé et utilisé == au lieu de === cela a fonctionné.{classname: '$index==selectedIndex'}
ng-class prend en charge une expression qui doit être évaluée à
Donc, en utilisant le formulaire 3), nous pouvons simplement écrire
Voir aussi Comment appliquer conditionnellement des styles CSS dans AngularJS? pour une réponse plus large.
Mise à jour : Angular 1.1.5 a ajouté la prise en charge d'un opérateur ternaire , donc si cette construction vous est plus familière:
la source
ng-class="{'selected': $index==selectedIndex}"
travaille pour moiMa méthode préférée utilise l'expression ternaire.
Remarque: Si vous utilisez une ancienne version d'Angular, vous devez l'utiliser à la place,
la source
ng-class="property.name=='timestamp' ? 'property-timestamp' : 'property-'+{{$index}}"
. Impossible de trouver un autre moyen.J'ajouterai à cela, car certaines de ces réponses semblent obsolètes. Voici comment je le fais:
Où 'isSelected' est une variable javascript définie dans le contrôleur angulaire de portée.
Pour répondre plus précisément à votre question, voici comment vous pouvez générer une liste avec cela:
HTML
JS
Voir: http://jsfiddle.net/tTfWM/
Voir: http://docs.angularjs.org/api/ng.directive:ngClass
la source
ng-class:className
simplementclass="{{className}}"
?Voici une solution beaucoup plus simple:
la source
J'ai récemment rencontré un problème similaire et j'ai décidé de créer un filtre conditionnel:
Il prend un seul argument, qui est soit un tableau à 2 éléments ou une chaîne, qui est transformé en un tableau auquel est ajoutée une chaîne vide comme deuxième élément:
la source
filter('yesNo', function() { return function(input) { // info('yesNo('+ input +')'); switch(input){ case '1': return ' yes '; break; default: return ' no '; break; } } });
Si vous voulez aller au-delà de l'évaluation binaire et garder votre CSS hors de votre contrôleur, vous pouvez implémenter un simple filtre qui évalue l'entrée par rapport à un objet de carte:
Cela vous permet d'écrire votre balisage comme ceci:
la source
Ce que j'ai fait récemment, c'était de faire ceci:
La
isShowing
valeur est une valeur qui se trouve sur mon contrôleur qui est basculée d'un simple clic sur un bouton et les parties entre les parenthèses simples sont des classes que j'ai créées dans mon fichier css.EDIT: Je voudrais également ajouter que codeschool.com a un cours gratuit parrainé par google sur AngularJS qui couvre tous ces trucs, puis certains. Il n'est pas nécessaire de payer quoi que ce soit, il suffit d'ouvrir un compte et de commencer! Bonne chance à tous!
la source
isShowing
une matrice dans le contrôleur?L'opérateur ternaire vient d'être ajouté à l'analyseur angulaire en 1.1.5 .
Donc, la façon la plus simple de le faire est maintenant:
la source
class="otherClass ng-class:($index==selectedIndex)? 'selected' : '';"
.On peut faire une fonction pour gérer la classe de retour avec condition
Et alors
Vous pouvez vous référer à la page de code complète à ng-class si exemple
la source
Je suis nouveau sur Angular mais j'ai trouvé ceci pour résoudre mon problème:
Cela appliquera conditionnellement une classe basée sur un var. Il commence par un téléchargement d'icône par défaut, en utilisant la classe ng, je vérifie le statut de
showDetails
sitrue/false
et applique la classe téléchargement d'icône de . Cela fonctionne très bien.J'espère que cela aide.
la source
Ça fonctionne super bien ;)
la source
Cela sera probablement revu à l'oubli, mais voici comment j'ai utilisé les opérateurs ternaires de 1.1.5 pour changer de classe selon que la ligne d'une table est la première, la moyenne ou la dernière - sauf s'il n'y a qu'une seule ligne dans la table:
la source
C'est dans mon travail plusieurs juges conditionnels:
la source
Voici une autre option qui fonctionne bien lorsque la classe ng ne peut pas être utilisée (par exemple lors du style SVG):
(Je pense que vous devez être sur le dernier Angular instable pour utiliser ng-attr-, je suis actuellement sur 1.1.4)
la source
eh bien je vous suggère de vérifier l'état de votre contrôleur avec une fonction retournant vrai ou faux .
et dans votre contrôleur vérifiez l'état
la source
partiel
manette
la source
Si vous utilisez la version angulaire pré v1.1.5 (c'est-à-dire pas d'opérateur ternaire) et que vous souhaitez toujours une manière équivalente de définir une valeur dans les deux conditions, vous pouvez faire quelque chose comme ceci:
la source
Si vous avez une classe commune qui est appliquée à de nombreux éléments, vous pouvez créer une directive personnalisée qui ajoutera cette classe comme ng-show / ng-hide.
Cette directive ajoutera la classe 'active' au bouton si on clique dessus
Plus d'informations
la source
J'ajoute juste quelque chose qui a fonctionné pour moi aujourd'hui, après de nombreuses recherches ...
J'espère que cela vous aidera à réussir votre développement.
=)
Syntaxe d'expression non documentée: excellent lien vers un site Web ... =)
la source
Vérifiez ça .
La tristement célèbre
if|else
déclaration AngularJS !!!Quand j'ai commencé à utiliser Angularjs, j'ai été un peu surpris de ne pas trouver de déclaration if / else.
Je travaillais donc sur un projet et j'ai remarqué que lors de l'utilisation de l'instruction if / else, la condition s'affiche lors du chargement. Vous pouvez utiliser ng-cloak pour résoudre ce problème.
.ng-cloak { display: none }
Merci amadou
la source
Vous pouvez utiliser ce package npm. Il gère tout et a des options pour les classes statiques et conditionnelles basées sur une variable ou une fonction.
la source