205 votes

conditionnels en ligne dans angular.js

Je me demandais s'il y avait un moyen dans angular d'afficher le contenu de manière conditionnelle autre que l'utilisation de ng-show, etc. Par exemple, dans backbone.js, je pourrais faire quelque chose avec du contenu en ligne dans un modèle, par exemple :

<% if (myVar === "two") { %> show this<% } %>

mais dans angular, il semble que je sois limité à l'affichage et à la dissimulation des éléments enveloppés dans des balises html.

<p ng-hide="true">I'm hidden</p>
<p ng-show="true">I'm shown</p>

Quelle est la méthode recommandée dans angular pour afficher et masquer conditionnellement du contenu en ligne en utilisant simplement {{}} plutôt que d'envelopper le contenu dans des balises html ?

6 votes

S'il vous plaît désaccepter ma réponse et accepter 2Toad's quand vous avez une chance.

764voto

2Toad Points 1529

Angular 1.1.5 ajout de la prise en charge des opérateurs ternaires :

{{myVar === "two" ? "it's true" : "it's false"}}

14 votes

Cette réponse avec le plus de votes positifs devrait apparaître en tête des réponses... c'est de loin la plus correcte.

3 votes

Utilisateur1469779 envisagez d'accepter cette réponse car c'est la façon recommandée d'obtenir ce que vous voulez depuis longtemps.

13 votes

@2Toad, ma réponse était ancienne. C'est la réponse correcte maintenant, je ne sais pas si l'utilisateur sera de retour pour l'"accepter" maintenant, mais j'ai annoté ma réponse comme telle. Tel est le visage changeant du développement logiciel.

140voto

Ben Lesh Points 39290

EDIT : Réponse de 2Toad ci-dessous est ce que vous recherchez ! Upvotez cette chose

Si vous utilisez Angular <= 1.1.4, cette réponse fera l'affaire :

Une réponse de plus à cette question. Je publie une réponse séparée, car il s'agit davantage d'une tentative de solution "exacte" que d'une liste de solutions possibles :

Voici un filtre qui fera un "if immédiat" (aka iif) :

app.filter('iif', function () {
   return function(input, trueValue, falseValue) {
        return input ? trueValue : falseValue;
   };
});

et peut être utilisé comme ceci :

{{foo == "bar" | iif : "it's true" : "no, it's not"}}

0 votes

Merci blesh, c'est ce que je cherchais. Cependant, je remarque que si j'essaie de mettre une balise html dans une des valeurs, cela casse : {{thing.second == "two" | iif : "<ul class='two-class'>" : "<ul>"}} Je me rends compte qu'il peut y avoir de meilleures façons de faire cela dans angular, mais y a-t-il un moyen d'échapper "<" et ">" afin que les balises puissent être affichées comme faisant partie de la chaîne ?

1 votes

NgBind ne permet pas la sortie HTML, vous voudriez utiliser ng-bind-html-unsafe

0 votes

L'exemple de ng-binf-html-unsafe dans la documentation angulaire l'utilise à l'intérieur d'une balise, par exemple <ANY ng-bind-html-unsafe="{expression}">. Il n'est peut-être pas possible de faire ce que j'essaie de faire en ligne.

61voto

Ben Lesh Points 39290

Il y a des milliers de façons d'aborder ce sujet. Je réalise que votre question concerne spécifiquement les {{}}, mais pour les autres qui viennent ici, je pense qu'il est utile de montrer certaines des autres options.

sur votre $scope (IMO, c'est votre meilleure chance dans la plupart des scénarios) :

  app.controller('MyCtrl', function($scope) {
      $scope.foo = 1;

      $scope.showSomething = function(input) {
           return input == 1 ? 'Foo' : 'Bar';
      };
   });

 <span>{{showSomething(foo)}}</span>

ng-show et ng-hide bien sûr :

 <span ng-show="foo == 1">Foo</span><span ng-hide="foo == 1">Bar</span>

ngSwitch

 <div ng-switch on="foo">
   <span ng-switch-when="1">Foo</span>
   <span ng-switch-when="2">Bar</span>
   <span ng-switch-default>What?</span>
 </div>

Un filtre personnalisé comme le suggère Bertrand. (c'est votre meilleur choix si vous devez faire la même chose encore et encore)

app.filter('myFilter', function() {
   return function(input) {
     return input == 1 ? 'Foo' : 'Bar';
   }
}

{{foo | myFilter}}

Ou une directive personnalisée :

app.directive('myDirective', function() {
   return {
     restrict: 'E',
     replace: true,
     link: function(scope, elem, attrs) {
       scope.$watch(attrs.value, function(v) {
          elem.text(v == 1 ? 'Foo': 'Bar');
       });
     }
   };
});

<my-directive value="foo"></my-directive>

Personnellement, dans la plupart des cas, j'opterais pour une fonction sur mon champ d'application, ce qui permet de garder le balisage assez propre, et c'est rapide et facile à mettre en œuvre. À moins que vous ne fassiez exactement la même chose encore et encore, auquel cas je suivrais la suggestion de Bertrand et créerais un filtre ou éventuellement une directive, selon les circonstances.

Comme toujours, le plus important est que votre solution soit facile à maintenir. et j'espère qu'elle pourra être testée. Et cela va dépendre complètement de votre situation spécifique.

18voto

Ashley Davis Points 3016

J'utilise ce qui suit pour définir de manière conditionnelle l'attr de la classe lorsque ng-class ne peut pas être utilisé (par exemple pour styliser un SVG) :

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

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

(Je pense que vous devez être sur la dernière version instable d'Angular pour utiliser ng-attr-, je suis actuellement sur 1.1.4)

J'ai publié un article sur le travail avec AngularJS+SVG qui traite de ce sujet et des questions connexes. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS

15voto

ezequielc Points 43

Pour vérifier le contenu d'une variable et avoir un texte par défaut, vous pouvez utiliser :

<span>{{myVar || 'Text'}}</span>

1 votes

Merci ! J'ai essayé mais il me manque les guillemets autour de la chaîne :-)

0 votes

Pour une raison quelconque, cette syntaxe ne fonctionne pas avec les liaisons uniques {{::myVar || 'Text'}} ne fonctionnera pas. Doit être sans le : :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X