Comment pourrais-je avoir plusieurs cas dans une *ngIf
déclaration? Je suis habitué à Vue ou angulaire 1 d'avoir un if
, else if
et else
, mais il semble que angulaire 4 a seulement true
( if
) et false
( else
) condition.
D'après la documentation, je ne peux que faire:
<ng-container *ngIf="foo === 1; then first else second"></ng-container>
<ng-template #first>First</ng-template>
<ng-template #second>Second</ng-template>
<ng-template #third>Third</ng-template>
Mais je veux avoir plusieurs conditions (quelque chose comme):
<ng-container *ngIf="foo === 1; then first; foo === 2; then second else third"></ng-container>
<ng-template #first>First</ng-template>
<ng-template #second>Second</ng-template>
<ng-template #third>Third</ng-template>
Mais je finis par devoir utiliser ngSwitch
, ce qui ressemble à un hack:
<ng-container [ngSwitch]="true">
<div *ngSwitchCase="foo === 1">First</div>
<div *ngSwitchCase="bar === 2">Second</div>
<div *ngSwitchDefault>Third</div>
</ng-container>
Alternativement, il semble que beaucoup de syntaxes auxquelles je suis habitué à partir d'Angular 1 et Vue ne sont pas prises en charge dans Angular 4, alors quelle serait la manière recommandée de structurer mon code avec des conditions comme celle-ci?
angular
templates
angular-ng-if
Alexandre Abakumov
la source
la source
Réponses:
Une autre alternative consiste à imbriquer les conditions
la source
<ng-template #second *ngIf="foo === 2;else third">
Vous pouvez simplement utiliser:
sauf si la partie ng-container est importante pour votre conception, je suppose.
Voici un Plunker
la source
if (index === 1) else if (foo === 2)
qui devrait être écritif (index === 1) if (index !== 1 && foo === 2)
qui est un peu brouillon et plus sujet aux erreurs, plus nous devons écrire de la logique inverse.if (item === 'food' && kind === 'hamburger') {} else if (item === 'food' && kind === 'hotdog') {} else if (item === 'drink' && kind === 'beer') {} else if (item === 'drink' && kind === 'wine') {} else { /* could be poisonous */ }
NgTemplateOutlet
contexte comme * ngTemplateOutlet = "drink; context: beer", ou peut-être un autre composant pour la catégorisation.Cela semble être la manière la plus propre de faire
dans le modèle:
Notez que cela fonctionne comme une
else if
instruction appropriée devrait lorsque les conditions impliquent différentes variables (un seul cas est vrai à la fois). Certaines des autres réponses ne fonctionnent pas correctement dans un tel cas.à part: gosh angular, c'est un
else if
code de modèle vraiment moche ...la source
Vous pouvez utiliser plusieurs méthodes basées sur la prudence:
Si votre variable est limitée à un nombre ou une chaîne spécifique , le meilleur moyen est d'utiliser ngSwitch ou ngIf:
Ci-dessus ne convient pas pour if elseif sinon codes et codes dynamiques, vous pouvez utiliser le code ci-dessous:
la source
*ngIf="foo >= 7; then t7"
au lieu de... else t7
.foo >= 4 && foo <= 6; then t46; else t7
devraient fonctionner.Pour éviter l'imbrication et ngSwitch, il existe également cette possibilité, qui exploite le fonctionnement des opérateurs logiques en Javascript:
la source
Ou peut-être simplement utiliser des chaînes conditionnelles avec un opérateur ternaire.
if … else if … else if … else
chaîne.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#Conditional_chains
J'aime mieux cette approche.
la source
la source
Vous pouvez également utiliser cette vieille astuce pour convertir des blocs if / then / else complexes en une instruction switch légèrement plus propre:
la source