Q1. Supposons que je veuille modifier l'apparence de chaque "élément" qu'un utilisateur marque pour suppression avant d'appuyer sur le bouton principal "supprimer". (Cette rétroaction visuelle immédiate devrait éliminer la nécessité de la boîte de dialogue proverbiale «Êtes-vous sûr?».) L'utilisateur cochera les cases pour indiquer les éléments à supprimer. Si une case n'est pas cochée, cet élément devrait revenir à son aspect normal.
Quelle est la meilleure façon d'appliquer ou de supprimer le style CSS?
Q2. Supposons que je veuille permettre à chaque utilisateur de personnaliser la présentation de mon site. Par exemple, sélectionnez parmi un ensemble fixe de tailles de police, autorisez des couleurs de premier plan et d'arrière-plan définissables par l'utilisateur, etc.
Quelle est la meilleure façon d'appliquer le style CSS que l'utilisateur sélectionne / saisit?
Réponses:
Angular fournit un certain nombre de directives intégrées pour manipuler le style CSS de manière conditionnelle / dynamique:
La "voie angulaire" normale implique de lier une propriété modèle / portée à un élément d'interface utilisateur qui acceptera les entrées / manipulations de l'utilisateur (c'est-à-dire, utiliser ng-modèle), puis d'associer cette propriété de modèle à l'une des directives intégrées mentionnées ci-dessus.
Lorsque l'utilisateur modifie l'interface utilisateur, Angular mettra automatiquement à jour les éléments associés sur la page.
Q1 ressemble à un bon cas pour ng-class - le style CSS peut être capturé dans une classe.
ng-class accepte une "expression" qui doit correspondre à l'une des valeurs suivantes:
En supposant que vos éléments sont affichés en utilisant ng-repeat sur un modèle de tableau, et que lorsque la case à cocher d'un élément est cochée, vous souhaitez appliquer la
pending-delete
classe:Ci-dessus, nous avons utilisé le type d'expression ng-class # 3 - une carte / un objet de noms de classe aux valeurs booléennes.
Q2 ressemble à un bon cas pour le style ng - le style CSS est dynamique, nous ne pouvons donc pas définir de classe pour cela.
ng-style accepte une "expression" qui doit être évaluée comme:
Pour un exemple artificiel, supposons que l'utilisateur puisse taper un nom de couleur dans une texbox pour la couleur d'arrière-plan (un sélecteur de couleur jQuery serait beaucoup plus agréable):
Violon pour les deux ci-dessus.
Le violon contient également un exemple de ng-show et ng-hide . Si une case est cochée, en plus de la couleur d'arrière-plan qui devient rose, du texte est affiché. Si «rouge» est entré dans la zone de texte, un div devient masqué.
la source
J'ai rencontré des problèmes lors de l'application de classes à l'intérieur des éléments de table lorsque j'avais déjà appliqué une classe à l'ensemble de la table (par exemple, une couleur appliquée aux lignes impaires
<myClass tbody tr:nth-child(even) td>
). Il semble que lorsque vous inspectez l'élément avec les outils de développement ,element.style
aucun style ne soit attribué. Donc, au lieu d'utiliserng-class
, j'ai essayé d'utiliserng-style
, et dans ce cas, le nouvel attribut CSS apparaît à l'intérieurelement.style
. Ce code fonctionne très bien pour moi:Myvar est ce que j'évalue , et dans chaque cas, j'applique un style à chacun en
<td>
fonction de la valeur de myvar , qui écrase le style actuel appliqué par la classe CSS pour la table entière.METTRE À JOUR
Si vous souhaitez appliquer une classe à la table par exemple, lorsque vous visitez une page ou dans d'autres cas, vous pouvez utiliser cette structure:
Fondamentalement, ce dont nous avons besoin pour activer une classe ng, c'est la classe à appliquer et une déclaration vraie ou fausse. True applique la classe et false non. Nous avons donc ici deux vérifications de l'itinéraire de la page et un OU entre eux, donc si nous sommes dans
/route_a
OU nous sommes dansroute_b
, la classe active sera appliquée.Cela fonctionne simplement avec une fonction logique à droite qui renvoie vrai ou faux.
Ainsi, dans le premier exemple, le style ng est conditionné par trois instructions. Si tous sont faux, aucun style n'est appliqué, mais selon notre logique, au moins un va être appliqué, donc, l'expression logique vérifiera quelle comparaison de variable est vraie et parce qu'un tableau non vide est toujours vrai, cela laissé un tableau en retour et avec un seul vrai, étant donné que nous utilisons OU pour toute la réponse, le style restant sera appliqué.
Au fait, j'ai oublié de vous donner la fonction isActive ():
NOUVELLE MISE À JOUR
Voici quelque chose que je trouve vraiment utile. Lorsque vous devez appliquer une classe en fonction de la valeur d'une variable, par exemple, une icône en fonction du contenu de la
div
, vous pouvez utiliser le code suivant (très utile dansng-repeat
):la source
Cela 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)
J'ai publié un article sur le travail avec AngularJS + SVG. Il parle de cette question et de bien d'autres. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS
la source
ng-attr-
sur la page des directives , section Liaisons d'attributs ngAttr .ng-class
ne vous laisse pas exécuter la logique, mais leng-attr-class
fait. Ils ont tous deux leur utilité, mais je peux parier que beaucoup de développeurs seront à la rechercheng-attr-class
.et code
css
la source
Cette solution a fait l'affaire pour moi
la source
Vous pouvez utiliser l'expression ternaire. Il y a deux façons de faire ça:
ou...
la source
Une autre option lorsque vous avez besoin d'un style CSS simple d'une ou deux propriétés:
Vue:
Manette:
la source
Voir l'exemple suivant
la source
Depuis AngularJS v1.2.0rc,
ng-class
etng-attr-class
échouent même avec les éléments SVG (Ils ont fonctionné plus tôt, même avec une liaison normale à l'intérieur de l'attribut de classe)Plus précisément, aucun de ces travaux maintenant:
Pour contourner ce problème, je dois utiliser
puis le style en utilisant
la source
Une autre façon (à l'avenir) d'appliquer le style de manière conditionnelle consiste à créer un style de portée conditionnelle
Mais de nos jours, seul FireFox prend en charge les styles étendus.
la source
Il y a une autre option que j'ai récemment découverte que certaines personnes peuvent trouver utile car elle vous permet de modifier une règle CSS dans un élément de style - évitant ainsi la nécessité d'une utilisation répétée d'une directive angulaire telle que ng-style, ng-class, ng-show, ng-hide, ng-animate et autres.
Cette option utilise un service avec des variables de service qui sont définies par un contrôleur et surveillées par une directive d'attribut que j'appelle "style personnalisé". Cette stratégie pourrait être utilisée de différentes manières, et j'ai essayé de fournir des conseils généraux avec ce violon .
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
Une chose à surveiller est - si le style CSS a des tirets - vous devez les supprimer. Donc, si vous souhaitez définir
background-color
, la bonne façon est:la source
Voici comment j'ai appliqué le style de texte gris de façon conditionnelle sur un bouton désactivé
Voici un exemple de travail:
https://stackblitz.com/edit/example-conditional-disable-button?file=src%2Fapp%2Fapp.component.html
la source