Quelle est la meilleure façon d'appliquer conditionnellement les attributs dans AngularJS?

je dois pouvoir ajouter par exemple" contenteditable " aux éléments, basé sur une variable booléenne sur scope.

exemple d'utilisation:

<h1 attrs="{'contenteditable="true"': editMode}">{{content.title}}</h1>

aurait pour effet d'ajouter contenteditable=true à l'élément si $scope.editMode était défini à true . Y a-t-il un moyen facile d'implémenter ce comportement d'attribut de type classe ng? J'envisage la rédaction d'une directive et partage si pas.

Edit: Je peux voir qu'il semble y avoir quelques similitudes entre ma proposition de directive attrs et ng-bind-attrs, mais elle a été supprimée en 1.0.0.rc3 , pourquoi?

260
demandé sur Meligy 2013-03-29 06:25:00

11 réponses

j'utilise ce qui suit pour définir conditionnellement la classe attr lorsque la classe ng ne peut pas être utilisée (par exemple lors de la conception SVG):

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"

La même approche devrait fonctionner pour d'autres types d'attributs.

(je pense que vous devez être sur les dernières instable Angulaire d'utiliser ng-attr-, je suis actuellement sur 1.1.4)

254
répondu Ashley Davis 2013-05-21 12:15:30

vous pouvez préfixer les attributs avec ng-attr pour evaluer une expression angulaire. Lorsque le résultat des expressions non définies supprime la valeur de l'attribut.

<a ng-attr-href="{{value || undefined}}">Hello World</a>

produira (quand la valeur est fausse)

<a ng-attr-href="{{value || undefined}}" href>Hello World</a>

alors n'utilisez pas false parce que cela produira le mot" false " comme valeur.

<a ng-attr-href="{{value || false}}" href="false">Hello World</a>

lors de l'utilisation de cette astuce dans une directive. Les attributs de la directive faux si elles sont manquantes d'une valeur.

par exemple, ce qui précède serait faux.

function post($scope, $el, $attr) {
      var url = $attr['href'] || false;
      alert(url === false);
}
107
répondu cgTag 2015-12-02 20:11:46

j'ai obtenu ce travail en mettant dur l'attribut. Et contrôler l'applicabilité de l'attribut en utilisant la valeur booléenne pour l'attribut.

Voici l'extrait de code:

<div contenteditable="{{ condition ? 'true' : 'false'}}"></div>

j'espère que cela aidera.

88
répondu jsbisht 2014-12-13 11:29:24

dans la dernière version D'Angular (1.1.5), ils ont inclus une directive conditionnelle appelée ngIf . Il est différent de ngShow et ngHide en ce que les éléments ne sont pas cachés, mais pas inclus dans le DOM du tout. Ils sont très utiles pour les composants qui sont coûteux à créer, mais ne sont pas utilisés:

<h1 ng-if="editMode" contenteditable=true>{{content.title}}</h1>
21
répondu Brian Genisio 2013-07-09 16:48:47

pour obtenir un attribut pour montrer une valeur spécifique basée sur un contrôle booléen, ou être complètement omis si le contrôle booléen a échoué, j'ai utilisé ce qui suit:

ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"

exemple d'usage:

<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">

produirait <div class="itWasTest"> ou <div> basé sur la valeur de params.type

13
répondu Glen 2015-09-10 22:10:53

<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>

produira quand isTrue=true : <h1 contenteditable="true">{{content.title}}</h1>

et quand isTrue=false : <h1>{{content.title}}</h1>

9
répondu Garfi 2015-06-05 08:29:30

j'ai en fait écrit un patch pour faire cela il y a quelques mois (après que quelqu'un l'ait demandé dans #angularjs sur freenode).

il ne sera probablement pas fusionné, mais il est très similaire à ngClass: https://github.com/angular/angular.js/pull/4269

qu'il soit fusionné ou non, le ng-attr - * existant est probablement adapté à vos besoins( comme d'autres l'ont mentionné), bien qu'il puisse être un peu plus clunk que le plus ngclass-style fonctionnalité que vous suggérez.

5
répondu chronicsalsa 2013-11-30 17:48:46

en ce qui concerne la solution acceptée, celle Postée par Ashley Davis, la méthode décrite imprime toujours l'attribut dans le DOM, indépendamment du fait que la valeur qui lui a été assignée est indéterminée.

par exemple, sur une configuration de champ d'entrée avec à la fois un modèle ng et un attribut de valeur:

<input type="text" name="myInput" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" />

indépendamment de ce qui se cache derrière ma valeur, l'attribut valeur est toujours imprimé dans le DOM, donc interprété. Ng-model alors, devient dépassé.

un peu désagréable, mais en utilisant ng-if fait le tour:

<input type="text" name="myInput" data-ng-if="value" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" />
<input type="text" name="myInput" data-ng-if="!value" data-ng-model="myModel" />

je recommande d'utiliser un contrôle plus détaillé à l'intérieur des directives ng-if:)

5
répondu alexc 2014-07-09 21:53:07

vous pouvez aussi utiliser une expression comme celle-ci:

<h1 ng-attr-contenteditable="{{ editMode ? true : false }}"></h1>
5
répondu Kamuran Sönecek 2015-12-22 14:30:30

pour la validation du champ d'entrée vous pouvez faire:

<input ng-model="discount" type="number" ng-attr-max="{{discountType == '%' ? 100 : undefined}}">

ceci appliquera l'attribut max à 100 uniquement si discountType est défini comme %

0
répondu Nestor Britez 2016-04-14 18:45:06

juste au cas où vous avez besoin de solution pour L'angle 2 puis son simple, utilisez la liaison de propriété comme ci-dessous, par exemple vous voulez faire l'entrée en lecture seulement conditionnellement, puis Ajouter dans les accolades carrées l'attribute suivi de = signe et expression.

<input [readonly]="mode=='VIEW'"> 
0
répondu Sanjay Singh 2018-07-20 21:10:47